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
65 changes: 53 additions & 12 deletions src/v1/04_infer.dag
Original file line number Diff line number Diff line change
Expand Up @@ -604,9 +604,17 @@ fn internal_expr_error_node(message: String, span: SourceSpan) -> Node {
// str_bindings hit) and resolving a larger entry over the same bytes (shared intern /
// census / overlay can miss). It is not the three refuted bind stories (foreign unit
// arm as competitor, Unique/Ambiguous owner-count, global_bare Conj insert).
// A HIT of lookup_type_by_name must still win: substituting the locals node there
// left Int fields as NoConnective leaves (span in the consumer) and emitted
// OperandIdentityUnavailableAt for `+` in std.import. Locals fill only the miss.
// A HIT of lookup_type_by_name that IS the owning Disj must still win: substituting
// the locals node there left Int fields as NoConnective leaves (span in the consumer)
// and emitted OperandIdentityUnavailableAt for `+` in std.import.
// Locals fill every other arm: name-lookup miss, parent-enum miss (lookup_type_for
// on the locals node fails under composed intern while the Disj node is still in
// locals), expected coproduct that owns the arm, and a HIT that is not that owner
// (unit-arm projection). A four-file compile_fixture over that geometry is not a
// discriminating RED for the intern-miss that
// gunbc.roadmap_belt_actuate belt_sessions_observe_for_instance hits under
// tools.generated_artifact_gate; that producer is the required generated-artifact
// resolve, not a second always-green floor witness.
fn local_coproduct_owner_from_locals(scope: InferScope, name: String) -> Node? {
match map_get(scope.locals, name) {
Present { value: binding } =>
Expand Down Expand Up @@ -8632,10 +8640,11 @@ fn infer_record_lit_structural(occurrence_identity: NodeOccurrenceIdentity, type
} else {
let type_lookup = lookup_type_by_name(env: scope.type_env, name: type_name.value)
let owner_from_locals = local_coproduct_owner_from_locals(scope: scope, name: type_name.value)
let owner_from_variant_node = variant_owner_node(scope: scope, name: type_name.value)
let local_variant_parent = match lookup_variant_parent_enum(scope: scope, name: type_name.value) {
Present { value: p } => Present { value: p }
Absent =>
match variant_owner_node(scope: scope, name: type_name.value) {
match owner_from_variant_node {
Present { value: owner } => Present { value: authored_name_at(source_indices: scope.type_env.source_indices, node: owner) }
Absent => record_lit_parent_enum_from_expected(type_name: type_name.value, expected: expected, scope: scope)
}
Expand All @@ -8658,24 +8667,56 @@ fn infer_record_lit_structural(occurrence_identity: NodeOccurrenceIdentity, type
Present { value: tn } => tn
Absent => error_type
}
let type_name_declares_own_type = match lookup_binding_on_chain(env: scope.type_env, name: type_name.value) {
let type_name_declares_own_product = match lookup_binding_on_chain(env: scope.type_env, name: type_name.value) {
Present { value: name_binding } =>
binding_declares_name(binding: name_binding, name: type_name.value, source_indices: scope.type_env.source_indices)
&& name_binding.resolved.connective == Conj
Absent => false
}
let raw_resolved = match local_variant_parent {
let skip_owner_widen = type_name_declares_own_product || match local_variant_parent {
Present { value: parent_name } => parent_name == "Optional"
Absent => false
}
let interned_owner = match local_variant_parent {
Present { value: parent_name } =>
if parent_name == "Optional" || type_name_declares_own_type { variant_lookup_resolved } else {
if skip_owner_widen { none } else {
match lookup_type_by_name(env: scope.type_env, name: parent_name) {
Present { value: parent_decl } => parent_decl
Present { value: parent_decl } =>
if parent_decl.connective == Disj
&& has_child_named(n: parent_decl, name: type_name.value, source_indices: scope.type_env.source_indices) {
Present { value: parent_decl }
} else { none }
Absent => none
}
}
Absent => none
}
let expected_owner = match record_lit_expected_coproduct(expected: expected, scope: scope) {
Present { value: coproduct } =>
if has_child_named(n: coproduct, name: type_name.value, source_indices: scope.type_env.source_indices) {
Present { value: coproduct }
} else { none }
Absent => none
}
let raw_resolved = if skip_owner_widen {
variant_lookup_resolved
} else {
match interned_owner {
Present { value: parent_decl } => parent_decl
Absent =>
match owner_from_locals {
Present { value: owner } => owner
Absent =>
match owner_from_locals {
match owner_from_variant_node {
Present { value: owner } => owner
Absent => variant_lookup_resolved
Absent =>
match expected_owner {
Present { value: coproduct } => coproduct
Absent => variant_lookup_resolved
}
}
}
}
Absent => variant_lookup_resolved
}
}
let expected_optional_parent = Present { value: "Optional" }
let is_present_ctor = type_name.value == "Present" && local_variant_parent == expected_optional_parent
Expand Down
107 changes: 77 additions & 30 deletions src/v1/stage0/src/v1_compiler_infer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14060,22 +14060,22 @@ Rc::new(FieldInferResult {
);
let owner_from_locals =
local_coproduct_owner_from_locals(scope.clone(), type_name.clone().unwrap());
let owner_from_variant_node =
variant_owner_node(scope.clone(), type_name.clone().unwrap());
let local_variant_parent =
match lookup_variant_parent_enum(scope.clone(), type_name.clone().unwrap()) {
Some(p) => Some(p.clone()),
std::option::Option::None => {
match variant_owner_node(scope.clone(), type_name.clone().unwrap()) {
Some(owner) => Some(crate::v1_std_core::authored_name_at(
scope.type_env.clone().source_indices.clone(),
owner.clone(),
)),
std::option::Option::None => record_lit_parent_enum_from_expected(
type_name.clone().unwrap(),
expected.clone(),
scope.clone(),
),
}
}
std::option::Option::None => match owner_from_variant_node.clone() {
Some(owner) => Some(crate::v1_std_core::authored_name_at(
scope.type_env.clone().source_indices.clone(),
owner.clone(),
)),
std::option::Option::None => record_lit_parent_enum_from_expected(
type_name.clone().unwrap(),
expected.clone(),
scope.clone(),
),
},
};
let effective_lookup = match type_lookup.clone() {
Some(_) => type_lookup.clone(),
Expand Down Expand Up @@ -14106,38 +14106,85 @@ Rc::new(FieldInferResult {
Some(tn) => tn.clone(),
std::option::Option::None => error_type(),
};
let type_name_declares_own_type =
let type_name_declares_own_product =
match crate::v1_compiler_infer_env::lookup_binding_on_chain(
scope.type_env.clone(),
type_name.clone().unwrap(),
) {
Some(name_binding) => crate::v1_compiler_infer_env::binding_declares_name(
name_binding.clone(),
type_name.clone().unwrap(),
scope.type_env.clone().source_indices.clone(),
),
Some(name_binding) => {
(crate::v1_compiler_infer_env::binding_declares_name(
name_binding.clone(),
type_name.clone().unwrap(),
scope.type_env.clone().source_indices.clone(),
) && (name_binding.resolved.clone().connective.clone()
== Connective::Conj))
}
std::option::Option::None => false,
};
let raw_resolved = match local_variant_parent.clone() {
let skip_owner_widen = (type_name_declares_own_product.clone()
|| match local_variant_parent.clone() {
Some(parent_name) => (parent_name.clone() == "Optional".to_string()),
std::option::Option::None => false,
});
let interned_owner = match local_variant_parent.clone() {
Some(parent_name) => {
if ((parent_name.clone() == "Optional".to_string())
|| type_name_declares_own_type.clone())
{
variant_lookup_resolved.clone()
if skip_owner_widen.clone() {
std::option::Option::None
} else {
match crate::v1_compiler_infer_env::lookup_type_by_name(
scope.type_env.clone(),
parent_name.clone(),
) {
Some(parent_decl) => parent_decl.clone(),
std::option::Option::None => match owner_from_locals.clone() {
Some(owner) => owner.clone(),
std::option::Option::None => variant_lookup_resolved.clone(),
},
Some(parent_decl) => {
if ((parent_decl.connective.clone() == Connective::Disj)
&& crate::v1_std_core::has_child_named(
parent_decl.clone(),
type_name.clone().unwrap(),
scope.type_env.clone().source_indices.clone(),
))
{
Some(parent_decl.clone())
} else {
std::option::Option::None
}
}
std::option::Option::None => std::option::Option::None,
}
}
}
std::option::Option::None => variant_lookup_resolved.clone(),
std::option::Option::None => std::option::Option::None,
};
let expected_owner =
match record_lit_expected_coproduct(expected.clone(), scope.clone()) {
Some(coproduct) => {
if crate::v1_std_core::has_child_named(
coproduct.clone(),
type_name.clone().unwrap(),
scope.type_env.clone().source_indices.clone(),
) {
Some(coproduct.clone())
} else {
std::option::Option::None
}
}
std::option::Option::None => std::option::Option::None,
};
let raw_resolved = if skip_owner_widen.clone() {
variant_lookup_resolved.clone()
} else {
match interned_owner.clone() {
Some(parent_decl) => parent_decl.clone(),
std::option::Option::None => match owner_from_locals.clone() {
Some(owner) => owner.clone(),
std::option::Option::None => match owner_from_variant_node.clone() {
Some(owner) => owner.clone(),
std::option::Option::None => match expected_owner.clone() {
Some(coproduct) => coproduct.clone(),
std::option::Option::None => variant_lookup_resolved.clone(),
},
},
},
}
};
let expected_optional_parent = Some("Optional".to_string());
let is_present_ctor = ((type_name.clone().unwrap() == "Present".to_string())
Expand Down
Loading