Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions src/v2/extdeps/languages/rust_wrap_decision_fixtures.dag
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
module v2.extdeps.languages.rust_wrap_decision_test

import std.algebra { Empty }
import std.occurrence_identity { OccurrenceSynthetic }
import v2.extdeps.languages.rust {
rust_named_edge,
rust_reference_layer_tokens,
rust_sg_rc_use_site_ownership_catalog,
rust_type_expression_projection_bundle_node
}
import v2.std.collection { List, empty_map }
import v2.std.compilers.lexing { VoidLexRules }
import v2.std.compilers.target_model {
ProducedDeclUnwired,
TargetModel,
target_model_emit_transforms_empty,
target_reference_layer_tokens_node,
target_use_site_ownership_catalog_node
}
import v2.std.host_transport { target_emit_host_runtime_row_unconfigured }
import v2.std.node { Conj, Edge, Node, TypeNode }

// Cost fixtures for v2.test.claim.wrap_decision_predicate. The claims there previously demanded
// rust_sg2_type_expr_target_model(), whose bundle carries nine named edges; wrap_decision_gate
// reads exactly three of them by name — use_site_ownership_realizations, reference_layer_tokens
// and value_semantics_carriers — and the emit-boundary claim adds type_expression_projection via
// translate_apply_wrap_gate_to_type_shell. The six that remain (serialize_source,
// translation_rules, selection_policy, declared_inhabitants, collection_realization,
// signature_realizations) are unreachable from every claim in that module.
//
// The mechanism is that the claims no longer demand rust_sg2_type_expr_target_model() at all, and
// what replaces it is cheaper to BUILD. Which part of the production model was the expensive part
// is a question for the instrument rather than for this comment — DESIGN section 4c means no
// annotation can carry a cost measurement, so the figures live only in
// required_floor_claim_cost.tsv. What IS decidable from source, and is what the fixtures below are
// authored from, is which fields and edges each claim reads.
//
// WHAT IS DELIBERATELY NOT SUBSTITUTED: the ownership catalog rows stay the LIVE rust catalog,
// not a copy of the rows the claims happen to read. The R1 flow controls in that module are
// stated as drawn from the live catalog by design — their discriminating content is that rust's
// own rows disagree by position — so a synthetic row set would answer a different question while
// still passing. Shrinking the catalog is therefore out of scope for this fixture; the saving
// here comes only from the edges no claim can reach.

fn wrap_decision_fixture_bundle(children: List<Edge>) -> Node {
Node {
kind: TypeNode { connective: Conj },
children: children,
occurrence_id: OccurrenceSynthetic
}
}

fn wrap_decision_fixture_reference_layer_tokens_edge() -> Edge {
rust_named_edge(
name: ^target_model_edge_reference_layer_tokens,
target: target_reference_layer_tokens_node(tokens: rust_reference_layer_tokens())
)
}

fn wrap_decision_fixture_ownership_catalog_edge() -> Edge {
rust_named_edge(
name: ^target_model_edge_use_site_ownership_realizations,
target: target_use_site_ownership_catalog_node(
rows: rust_sg_rc_use_site_ownership_catalog()
)
)
}

fn wrap_decision_fixture_type_expression_projection_edge() -> Edge {
rust_named_edge(
name: ^target_model_edge_type_expression_projection,
target: rust_type_expression_projection_bundle_node()
)
}

fn wrap_decision_fixture_model(bundle: Node) -> TargetModel {
TargetModel {
produced_decl_support: ProducedDeclUnwired,
bundle: bundle,
lex: VoidLexRules,
binding_spellings: empty_map(),
token_class_emit_transforms: target_model_emit_transforms_empty,
authority_source_text: Empty,
runtime_row: target_emit_host_runtime_row_unconfigured
}
}

// Both edges wrap_decision_gate's disposition step reads by name. Neither
// value_semantics_carriers nor any core edge is present: an absent
// value_semantics_carriers edge is decoded as the empty carrier list, which is what the
// production bundle also yields, since it carries no such edge either.
fn wrap_decision_fixture_gate_target() -> TargetModel {
wrap_decision_fixture_model(
bundle: wrap_decision_fixture_bundle(
children: [
wrap_decision_fixture_reference_layer_tokens_edge(),
wrap_decision_fixture_ownership_catalog_edge()
]
)
)
}

// The gate target plus the projection edge, which translate_apply_wrap_gate_to_type_shell reads
// through type_expression_projection_from_target on the WrapByReference arm alone. Kept separate
// so the fourteen claims that never take that arm do not construct it.
fn wrap_decision_fixture_boundary_target() -> TargetModel {
wrap_decision_fixture_model(
bundle: wrap_decision_fixture_bundle(
children: [
wrap_decision_fixture_reference_layer_tokens_edge(),
wrap_decision_fixture_ownership_catalog_edge(),
wrap_decision_fixture_type_expression_projection_edge()
]
)
)
}

// Neither ownership-realizations nor reference-layer-tokens edge: the disposition step answers
// "not applicable" and the gate never reaches the catalog.
fn wrap_decision_fixture_bundle_absent_target() -> TargetModel {
wrap_decision_fixture_model(bundle: wrap_decision_fixture_bundle(children: Empty))
}

// Exactly one of the two edges the disposition step pairs, so it refuses as partial.
fn wrap_decision_fixture_partial_bundle_target() -> TargetModel {
wrap_decision_fixture_model(
bundle: wrap_decision_fixture_bundle(
children: [wrap_decision_fixture_ownership_catalog_edge()]
)
)
}
103 changes: 30 additions & 73 deletions src/v2/test/claim/wrap_decision_predicate_test.dag
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
module v2.test.claim.wrap_decision_predicate

import std.occurrence_identity { OccurrenceSynthetic }
import v2.compiler.translate { translate_apply_use_site_ownership_to_projected_boundary }
import v2.compiler.wrap_decision { wrap_decision_gate, wrap_decision_flow_gate }
import v2.extdeps.languages.rust {
rust_named_edge,
rust_sg2_type_expr_target_model,
rust_sg_rc_use_site_ownership_catalog,
rust_type_expression_projection
import v2.extdeps.languages.rust { rust_type_expression_projection }
import v2.extdeps.languages.rust_wrap_decision_test {
wrap_decision_fixture_boundary_target,
wrap_decision_fixture_bundle_absent_target,
wrap_decision_fixture_gate_target,
wrap_decision_fixture_partial_bundle_target
}
import v2.std.compilers.target_model {
ProducedDeclUnwired,
TargetModel,
TargetOwnershipUseSite,
TargetReferenceLayer,
Expand All @@ -32,20 +31,14 @@ import v2.std.compilers.target_model {
target_carrier_use_site_verdict_node,
target_type_expr_atom_emitted,
target_type_expr_instantiation_emitted,
target_type_expr_emitted_wire_decode,
target_use_site_ownership_catalog_node
target_type_expr_emitted_wire_decode
}
import v2.std.diagnostic { Accepted, Rejected }
import v2.std.logic { Bool }
import v2.std.node {
Conj,
Node,
TypeNode,
}
import v2.std.node { Node }
import v2.std.collection { list_at_optional }
import v2.std.node_query { node_positional_child_targets }
import v2.std.optional { Absent, Present }
import v2.std.text { String }

// Derisk witnesses for rc-ownership-wrap-decision-design.md: wrap_decision_gate is the single
// authority for Rc/Box/owned type wrapping at ONE emit position, and wrap_decision_flow_gate is the
Expand All @@ -56,49 +49,13 @@ import v2.std.text { String }
// distinct_reference_layers witnesses red while missing_row and both accept controls stay green;
// make wrap_decisions_equal layer-blind -> distinct_reference_layers alone reds. A witness set that
// reds together says less than one whose profile names which witness guards which arm.

fn wrap_decision_sg_rc_target() -> TargetModel {
rust_sg2_type_expr_target_model()
}

fn wrap_decision_bundle_absent_target() -> TargetModel {
TargetModel {
produced_decl_support: ProducedDeclUnwired,
bundle: Node {
kind: TypeNode { connective: Conj },
children: [],
occurrence_id: OccurrenceSynthetic
},
lex: wrap_decision_sg_rc_target().lex,
binding_spellings: wrap_decision_sg_rc_target().binding_spellings,
token_class_emit_transforms: wrap_decision_sg_rc_target().token_class_emit_transforms,
authority_source_text: wrap_decision_sg_rc_target().authority_source_text,
runtime_row: wrap_decision_sg_rc_target().runtime_row
}
}

fn wrap_decision_partial_bundle_target() -> TargetModel {
TargetModel {
produced_decl_support: ProducedDeclUnwired,
bundle: Node {
kind: TypeNode { connective: Conj },
children: [
rust_named_edge(
name: ^target_model_edge_use_site_ownership_realizations,
target: target_use_site_ownership_catalog_node(
rows: rust_sg_rc_use_site_ownership_catalog()
)
)
],
occurrence_id: OccurrenceSynthetic
},
lex: wrap_decision_sg_rc_target().lex,
binding_spellings: wrap_decision_sg_rc_target().binding_spellings,
token_class_emit_transforms: wrap_decision_sg_rc_target().token_class_emit_transforms,
authority_source_text: wrap_decision_sg_rc_target().authority_source_text,
runtime_row: wrap_decision_sg_rc_target().runtime_row
}
}
//
// COST: the target is the fixture in v2.extdeps.languages.rust_wrap_decision_test rather than
// rust_sg2_type_expr_target_model(), which no claim here needs — wrap_decision_gate reaches only
// use_site_ownership_realizations, reference_layer_tokens and value_semantics_carriers. The
// fixture is a cheaper model to build; where that cost sat is the instrument's question, not this
// comment's. The ownership catalog stays rust's live one, which is what keeps
// the flow controls above answering the question they are stated to answer.

fn wrap_decision_gate_is_by_value(
target: TargetModel,
Expand Down Expand Up @@ -195,63 +152,63 @@ fn wrap_decision_gate_is_inapplicable(

test fn wrap_decision_diagnostics_return_is_rc() -> Bool {
wrap_decision_gate_is_rc_reference(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_diagnostics_node(),
use_site: OwnershipAtFunctionReturn
)
}

test fn wrap_decision_diagnostics_param_is_owned() -> Bool {
wrap_decision_gate_is_by_value(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_diagnostics_node(),
use_site: OwnershipAtFunctionParameter
)
}

test fn wrap_decision_probe_heap_param_miss_rejects() -> Bool {
wrap_decision_gate_rejects(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_probe_heap_node(),
use_site: OwnershipAtFunctionParameter
)
}

test fn wrap_decision_bundle_absent_inapplicable() -> Bool {
wrap_decision_gate_is_inapplicable(
target: wrap_decision_bundle_absent_target(),
target: wrap_decision_fixture_bundle_absent_target(),
source_carrier: target_carrier_diagnostics_node(),
use_site: OwnershipAtFunctionReturn
)
}

test fn wrap_decision_bundle_partial_rejects() -> Bool {
wrap_decision_gate_rejects(
target: wrap_decision_partial_bundle_target(),
target: wrap_decision_fixture_partial_bundle_target(),
source_carrier: target_carrier_diagnostics_node(),
use_site: OwnershipAtFunctionReturn
)
}

test fn wrap_decision_use_site_verdict_param_is_owned() -> Bool {
wrap_decision_gate_is_by_value(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_use_site_verdict_node(),
use_site: OwnershipAtFunctionParameter
)
}

test fn wrap_decision_use_site_verdict_return_is_owned() -> Bool {
wrap_decision_gate_is_by_value(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_use_site_verdict_node(),
use_site: OwnershipAtFunctionReturn
)
}

test fn wrap_decision_node_struct_field_is_box() -> Bool {
wrap_decision_gate_is_box_reference(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_node_node(),
use_site: OwnershipAtStructField
)
Expand Down Expand Up @@ -336,7 +293,7 @@ fn wrap_decision_flow_is_inapplicable(

test fn wrap_decision_flow_over_wrap_direction_refuses() -> Bool {
wrap_decision_flow_rejects(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_diagnostics_node(),
producer_site: OwnershipAtBindingProjection,
consumer_site: OwnershipAtFunctionParameter
Expand All @@ -345,7 +302,7 @@ test fn wrap_decision_flow_over_wrap_direction_refuses() -> Bool {

test fn wrap_decision_flow_under_wrap_direction_refuses() -> Bool {
wrap_decision_flow_rejects(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_diagnostics_node(),
producer_site: OwnershipAtFunctionParameter,
consumer_site: OwnershipAtBindingProjection
Expand All @@ -354,7 +311,7 @@ test fn wrap_decision_flow_under_wrap_direction_refuses() -> Bool {

test fn wrap_decision_flow_distinct_reference_layers_refuse() -> Bool {
wrap_decision_flow_rejects(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_node_node(),
producer_site: OwnershipAtBindingProjection,
consumer_site: OwnershipAtStructField
Expand All @@ -363,7 +320,7 @@ test fn wrap_decision_flow_distinct_reference_layers_refuse() -> Bool {

test fn wrap_decision_flow_missing_row_refuses() -> Bool {
wrap_decision_flow_rejects(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_probe_heap_node(),
producer_site: OwnershipAtFunctionReturn,
consumer_site: OwnershipAtFunctionParameter
Expand All @@ -372,7 +329,7 @@ test fn wrap_decision_flow_missing_row_refuses() -> Bool {

test fn wrap_decision_flow_agreeing_sites_accept() -> Bool {
wrap_decision_flow_is_by_value(
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_gate_target(),
source_carrier: target_carrier_use_site_verdict_node(),
producer_site: OwnershipAtFunctionReturn,
consumer_site: OwnershipAtFunctionParameter
Expand All @@ -381,7 +338,7 @@ test fn wrap_decision_flow_agreeing_sites_accept() -> Bool {

test fn wrap_decision_flow_bundle_absent_inapplicable() -> Bool {
wrap_decision_flow_is_inapplicable(
target: wrap_decision_bundle_absent_target(),
target: wrap_decision_fixture_bundle_absent_target(),
source_carrier: target_carrier_diagnostics_node(),
producer_site: OwnershipAtBindingProjection,
consumer_site: OwnershipAtFunctionParameter
Expand Down Expand Up @@ -427,7 +384,7 @@ fn wrap_decision_composite_boundary_result() -> Node {
match translate_apply_use_site_ownership_to_projected_boundary(
projected: wrap_decision_composite_projected(),
source_for_binding: wrap_decision_composite_source(),
target: wrap_decision_sg_rc_target(),
target: wrap_decision_fixture_boundary_target(),
projection: rust_type_expression_projection(),
use_site: OwnershipAtStructField
) {
Expand Down
Loading