diff --git a/src/v2/00_core.dag b/src/v2/00_core.dag index c1b8e2c5f97..cb16d77cc8b 100644 --- a/src/v2/00_core.dag +++ b/src/v2/00_core.dag @@ -376,6 +376,7 @@ type DeclaredFuncEnv { type Node { name: String + ident: Int span: SourceSpan ident_span: SourceSpan? // Fractal composition -- operations, capabilities, items are all children diff --git a/src/v2/05_emit_rust.dag b/src/v2/05_emit_rust.dag index c77d8e09e92..2ecf3cf828c 100644 --- a/src/v2/05_emit_rust.dag +++ b/src/v2/05_emit_rust.dag @@ -3550,7 +3550,44 @@ fn emit_typed_record_lit(type_name: String?, fields: List, parent_enum: St } else { val_str } concat(" ", emit_ident(name: f_name, target: Rust), ": ", field_val, ",") ) - let all_field_strs = field_strs + // Fill default values for fields defined on the type but not provided in source. + let provided_names = fields |> map(f => field_init_node_name_at(n: f, source_index: scope.type_env.source_index)) + let provided_set = fold(provided_names, init: empty_map(), f: (acc, n) => map_insert(acc, n, true)) + // Fill default values for struct fields not explicitly set in .dag source. + // Only emits defaults if ALL missing fields have known zero values — this avoids + // false positives from cross-module type name collisions in the summary registry. + let summary = lookup_emit_type_summary(emit_info: emit_info, type_name: tn) + let default_strs = match summary { + Some { value: s } => + let fs = s.field_summaries + let ftm = s.field_type_map + let missing = map_keys(fs) |> filter(k => !emit_map_has(m: provided_set, key: k)) + let all_defaultable = missing |> all(fname => + let has_zv = match map_get(ftm, fname) { + Some { value: ft } => match rust_zero_value(type_name: ft) { Some { value: _ } => true, None => false } + None => false + } + has_zv || is_optional_struct_field(emit_info: emit_info, struct_name: tn, field_name: fname) + ) + if all_defaultable { + missing |> flat_map(fname => + if is_optional_struct_field(emit_info: emit_info, struct_name: tn, field_name: fname) { + [concat(" ", emit_ident(name: fname, target: Rust), ": None,")] + } else { + match map_get(ftm, fname) { + Some { value: ft } => + match rust_zero_value(type_name: ft) { + Some { value: zv } => [concat(" ", emit_ident(name: fname, target: Rust), ": ", zv, ",")] + None => [] + } + None => [] + } + } + ) + } else { [] } + None => [] + } + let all_field_strs = concat(field_strs, default_strs) let fields_str = all_field_strs |> join(separator: "\n") let raw = concat(display_tn, " {\n", fields_str, "\n}") // Rc wrapping is the caller's responsibility (data_decl_body, emit_typed_expr, etc.). @@ -3561,6 +3598,15 @@ fn emit_typed_record_lit(type_name: String?, fields: List, parent_enum: St } +// Zero-value for a Rust type, used to fill struct fields not set in .dag source. +// Returns none if the type has no obvious zero-value (caller must set it explicitly). +fn rust_zero_value(type_name: String) -> String? { + if type_name == "Int" { Some { value: "0" } } + else if type_name == "Bool" { Some { value: "false" } } + else if type_name == "String" { Some { value: concat("\"\"", ".to_string()") } } + else { none } +} + fn emit_typed_bin_op(op: BinOp, algebra_field: AlgebraFieldKind?, left: Node, right: Node, registry: Map, scope: InferScope, depth: Int, shared_types: Map, emit_info: EmitGraphInfo) -> String { let l_str = emit_typed_expr(texpr: left, registry: registry, scope: scope, depth: depth, shared_types: shared_types, emit_info: emit_info, fuel: 1024) let r_str = emit_typed_expr(texpr: right, registry: registry, scope: scope, depth: depth, shared_types: shared_types, emit_info: emit_info, fuel: 1024) diff --git a/src/v2/stage0/src/v2_compiler_emit_rust.rs b/src/v2/stage0/src/v2_compiler_emit_rust.rs index 5e069841fb1..a80e6afda36 100644 --- a/src/v2/stage0/src/v2_compiler_emit_rust.rs +++ b/src/v2/stage0/src/v2_compiler_emit_rust.rs @@ -71,6 +71,7 @@ pub fn type_variable_node(id: String) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -3626,7 +3627,43 @@ let field_val = if needs_wrap.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 all_field_strs = field_strs; +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_index.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.clone(), 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()) { + Some(ft) => match rust_zero_value(&ft) { + Some(zv) => Rc::new(vec![v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(" ".to_string(), emit_ident(fname.clone(), RenderTarget::Rust)), ": ".to_string()), zv.clone()), ",".to_string())]), + None => Rc::new(vec![]), +}, + 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 @@ -3638,6 +3675,22 @@ raw } } +pub fn rust_zero_value(type_name: &String) -> Option { + if (type_name.clone().as_str() == "Int".to_string().as_str()) { + Some("0".to_string()) + } else { + if (type_name.clone().as_str() == "Bool".to_string().as_str()) { + 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())) + } else { + None + } + } + } +} + 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); diff --git a/src/v2/stage0/src/v2_compiler_infer.rs b/src/v2/stage0/src/v2_compiler_infer.rs index 52a7d95fed6..8a0168f9ee7 100644 --- a/src/v2/stage0/src/v2_compiler_infer.rs +++ b/src/v2/stage0/src/v2_compiler_infer.rs @@ -441,6 +441,7 @@ pub fn nominal_ref_node(name: &String, span: Rc, ident_span: Option< has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -586,6 +587,7 @@ pub fn type_variable_node(id: String) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -944,6 +946,7 @@ let fold_callable = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let lam_value = arg_value(&a); let prov_map = match (*elem_provenance.clone()).clone() { @@ -1329,6 +1332,7 @@ let final_receiver = if ((returns_receiver_self && is_fully_resolved(&bridge_res 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: 0, }) } else { receiver.clone() @@ -2246,6 +2250,7 @@ if (type_name.clone() == None) { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, })); } __result }); let anon_node = Rc::new(Node { name: "".to_string(), @@ -2265,6 +2270,7 @@ let anon_node = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let typed_field_nodes = typed_fields; let texpr = make_expr_node(Rc::new(ExprData::ExprRecordLit { @@ -3386,6 +3392,7 @@ Rc::new(Node { call_semantics: cs.clone(), descent_evidence: Some(evidence), }), + ident: 0, }) }, ExprData::ExprMatch => { @@ -3587,6 +3594,7 @@ Rc::new(Node { 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: 0, }) }, ExprData::ExprLet => { @@ -3654,6 +3662,7 @@ Rc::new(Node { 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: 0, }) }, ExprData::ExprBlock => { @@ -3731,6 +3740,7 @@ Rc::new(Node { 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: 0, }) }, ExprData::ExprMethodCall { .. } => { @@ -3887,6 +3897,7 @@ Rc::new(Node { 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: 0, }) } } else { @@ -3942,6 +3953,7 @@ Rc::new(Node { 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: 0, }) }, _ => map_children(&body, |child| annotate_descent(&child, &ctx)), @@ -4086,6 +4098,7 @@ let val_result = infer_expr(&val, &scope, &None); 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: 0, }), val_result.diagnostics.clone()) }); } __result }); Rc::new(InferPropertiesResult { @@ -4119,6 +4132,7 @@ let val_result = infer_expr(&val, &scope, &None); 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: 0, }), val_result.diagnostics.clone()) } } else { @@ -4158,6 +4172,7 @@ Rc::new(InferTransportResult { 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: 0, })), diagnostics: prop_result.diagnostics.clone(), }) @@ -4202,6 +4217,7 @@ if ((item.connective.clone() != Connective::NoConnective) && (item.transport.clo has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: v2_rt::concat(transport_diags, props_diags), }) @@ -4248,6 +4264,7 @@ Rc::new(TypedItemResult { has_non_tail_self_call: expr_has_non_tail_self_call(&body_typed, &item.name.clone(), true, &scope.type_env.clone().source_index.clone()), match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: v2_rt::concat(v2_rt::concat(transport_diags, props_diags), body_diags), }) @@ -4278,6 +4295,7 @@ Rc::new(TypedItemResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: v2_rt::concat(v2_rt::concat(transport_diags, props_diags), body_diags), }) @@ -4319,6 +4337,7 @@ Rc::new(TypedItemResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: v2_rt::concat(v2_rt::concat(transport_diags, props_diags), val_diags), }) @@ -4350,6 +4369,7 @@ Rc::new(TypedItemResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: v2_rt::concat(transport_diags, props_diags), }) @@ -4379,6 +4399,7 @@ Rc::new(TypedItemResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: v2_rt::concat(transport_diags, props_diags), }) @@ -4434,6 +4455,7 @@ let kernel_bindings_base = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().c has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), provenance: Rc::new(SubValueRelation::SubValueUnknown), }))); @@ -4457,6 +4479,7 @@ let kernel_bindings = v2_rt::rc_map_insert(kernel_bindings_base, "Unit".to_strin has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), provenance: Rc::new(SubValueRelation::SubValueUnknown), })); @@ -4480,6 +4503,7 @@ let some_value_field = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let some_variant = Rc::new(Node { name: "Some".to_string(), @@ -4499,6 +4523,7 @@ let some_variant = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let kernel_optional = Rc::new(Node { name: "Optional".to_string(), @@ -4518,6 +4543,7 @@ let kernel_optional = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let kernel_bindings = v2_rt::rc_map_insert(kernel_bindings.clone(), "Optional".to_string(), Rc::new(TypeBinding { name: "Optional".to_string(), @@ -4601,6 +4627,7 @@ if has_structure.clone() { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); v2_rt::rc_map_insert(acc.clone(), item.name.clone(), Rc::new(TypeBinding { name: item.name.clone(), @@ -4629,6 +4656,7 @@ v2_rt::rc_map_insert(acc.clone(), item.name.clone(), Rc::new(TypeBinding { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); v2_rt::rc_map_insert(acc.clone(), item.name.clone(), Rc::new(TypeBinding { name: item.name.clone(), @@ -4667,6 +4695,7 @@ v2_rt::rc_map_insert(acc.clone(), item.name.clone(), Rc::new(TypeBinding { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); v2_rt::rc_map_insert(acc.clone(), item.name.clone(), Rc::new(TypeBinding { name: item.name.clone(), @@ -4763,6 +4792,7 @@ let kernel_bindings = Rc::new(v2_rt::map_keys(&kernel_type_set())).iter().cloned has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), provenance: Rc::new(SubValueRelation::SubValueUnknown), }))); @@ -4786,6 +4816,7 @@ let some_value_field = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let some_variant = Rc::new(Node { name: "Some".to_string(), @@ -4805,6 +4836,7 @@ let some_variant = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let kernel_optional = Rc::new(Node { name: "Optional".to_string(), @@ -4824,6 +4856,7 @@ let kernel_optional = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let kernel_bindings = v2_rt::rc_map_insert(kernel_bindings.clone(), "Optional".to_string(), Rc::new(TypeBinding { name: "Optional".to_string(), @@ -4899,6 +4932,7 @@ if has_structure.clone() { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); v2_rt::rc_map_insert(acc.clone(), item.name.clone(), Rc::new(TypeBinding { name: item.name.clone(), @@ -4927,6 +4961,7 @@ v2_rt::rc_map_insert(acc.clone(), item.name.clone(), Rc::new(TypeBinding { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); v2_rt::rc_map_insert(acc.clone(), item.name.clone(), Rc::new(TypeBinding { name: item.name.clone(), diff --git a/src/v2/stage0/src/v2_compiler_infer_method.rs b/src/v2/stage0/src/v2_compiler_infer_method.rs index 6173fdb8532..b8e5a11ea16 100644 --- a/src/v2/stage0/src/v2_compiler_infer_method.rs +++ b/src/v2/stage0/src/v2_compiler_infer_method.rs @@ -35,6 +35,7 @@ pub fn type_variable_node(id: String) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } diff --git a/src/v2/stage0/src/v2_compiler_infer_patterns.rs b/src/v2/stage0/src/v2_compiler_infer_patterns.rs index 9ffb48c0c9f..8d3652173b0 100644 --- a/src/v2/stage0/src/v2_compiler_infer_patterns.rs +++ b/src/v2/stage0/src/v2_compiler_infer_patterns.rs @@ -85,6 +85,7 @@ let value_field = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let some_node = Rc::new(Node { name: "Some".to_string(), @@ -104,6 +105,7 @@ let some_node = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); some_node } diff --git a/src/v2/stage0/src/v2_compiler_infer_resolve.rs b/src/v2/stage0/src/v2_compiler_infer_resolve.rs index 42733088717..22f48fbac96 100644 --- a/src/v2/stage0/src/v2_compiler_infer_resolve.rs +++ b/src/v2/stage0/src/v2_compiler_infer_resolve.rs @@ -157,6 +157,7 @@ Rc::new(Node { 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: 0, }) } } else { @@ -186,6 +187,7 @@ Rc::new(Node { 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: 0, }) } } @@ -269,6 +271,7 @@ Rc::new(NodeResolveResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: base_diags, }) @@ -312,6 +315,7 @@ Rc::new(NodeResolveResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: rt_diags.clone(), }) @@ -338,6 +342,7 @@ Rc::new(NodeResolveResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: all_diags, }) @@ -400,6 +405,7 @@ Rc::new(NodeResolveResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: rt_diags.clone(), }) @@ -426,6 +432,7 @@ Rc::new(NodeResolveResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: field_diags.clone(), }) @@ -451,6 +458,7 @@ Rc::new(NodeResolveResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: all_diags, }) @@ -517,6 +525,7 @@ let resolved_node = Rc::new(Node { 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: 0, }); Rc::new(NodeResolveResult { resolved: resolved_node, @@ -546,6 +555,7 @@ let result = Rc::new(NodeResolveResult { 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: 0, }), diagnostics: v2_rt::concat(arity_diags, arg_diags), }); @@ -611,6 +621,7 @@ let resolved_key_child = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let resolved_val_child = Rc::new(Node { name: val_param_name, @@ -632,6 +643,7 @@ let resolved_val_child = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); Rc::new(NodeResolveResult { resolved: Rc::new(Node { @@ -652,6 +664,7 @@ Rc::new(NodeResolveResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: v2_rt::concat(key_diags, val_diags), }) @@ -694,6 +707,7 @@ let resolved_child = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); Rc::new(NodeResolveResult { resolved: Rc::new(Node { @@ -714,6 +728,7 @@ Rc::new(NodeResolveResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: el_diags, }) @@ -1522,6 +1537,7 @@ let env = tp_names.iter().cloned().fold(env.clone(), |e: Rc, tp_name: S has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), provenance: Rc::new(SubValueRelation::SubValueUnknown), })), @@ -1617,6 +1633,7 @@ Rc::new(ItemResult { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), diagnostics: v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(v2_rt::concat(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 19a109b56b8..cdd63377071 100644 --- a/src/v2/stage0/src/v2_compiler_infer_service.rs +++ b/src/v2/stage0/src/v2_compiler_infer_service.rs @@ -259,6 +259,7 @@ match matching.first().cloned() { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, })); } __result }), connective: Connective::Conj, params: Rc::new(vec![]), @@ -273,6 +274,7 @@ match matching.first().cloned() { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), op_params: op.params.clone(), })) diff --git a/src/v2/stage0/src/v2_compiler_infer_types.rs b/src/v2/stage0/src/v2_compiler_infer_types.rs index 71196b71172..f8c7ef12293 100644 --- a/src/v2/stage0/src/v2_compiler_infer_types.rs +++ b/src/v2/stage0/src/v2_compiler_infer_types.rs @@ -49,6 +49,7 @@ pub fn type_variable_node(id: String) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -158,6 +159,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), Rc::new(Node { name: val_id.clone(), span: make_span(0, 0), @@ -178,6 +180,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, })]), connective: Connective::NoConnective, params: Rc::new(vec![]), @@ -192,6 +195,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -223,6 +227,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, })]), connective: Connective::NoConnective, params: Rc::new(vec![]), @@ -237,6 +242,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -269,6 +275,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), Rc::new(Node { name: val_name, span: make_span(0, 0), @@ -289,6 +296,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, })]), connective: Connective::NoConnective, params: Rc::new(vec![]), @@ -303,6 +311,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -328,6 +337,7 @@ pub fn make_callable_type(func_params: Rc>>, ret: Rc) -> Rc, second: Rc) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), Rc::new(Node { name: "second".to_string(), span: make_span(0, 0), @@ -376,6 +387,7 @@ pub fn make_tuple_type(first: Rc, second: Rc) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, })]), connective: Connective::Conj, params: Rc::new(vec![]), @@ -390,6 +402,7 @@ pub fn make_tuple_type(first: Rc, second: Rc) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -414,6 +427,7 @@ pub fn algebra_value_field(name: &String, type_node: Rc) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -441,6 +455,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -464,6 +479,7 @@ pub fn enrich_base_with_fields(name: String, base: &Rc, fields: Rc) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -2010,6 +2011,7 @@ match form { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), state: s.clone(), err: Some(parse_error("expected item declaration (type, fn, func, service, resource, data, extern, pattern, interface)".to_string(), current_span(tokens.clone(), s.clone()))), @@ -2156,6 +2158,7 @@ let dummy = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let r = expect(&tokens, &state, &Rc::new(ExpectedToken::ExpectKeyword { text: form.keyword.clone(), @@ -2250,6 +2253,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -2280,6 +2284,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -2305,6 +2310,7 @@ pub fn outputs_to_inferred(outputs: &Rc>>, span: Rc, so has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }), })) } else { @@ -2333,6 +2339,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -2356,6 +2363,7 @@ pub fn make_capability_node(name: String, ident_span: Option>, in has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -2380,6 +2388,7 @@ let dummy = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let r = expect(&tokens, &state, &Rc::new(ExpectedToken::ExpectKeyword { text: "type".to_string(), @@ -2415,6 +2424,7 @@ pub fn parse_type_after_kw(tokens: &Rc>>, state: &Rc, has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let r = expect_ident(&tokens, &state); if has_err(r.err.clone()) { @@ -2451,6 +2461,7 @@ let named_dummy = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); if has_err(r.err.clone()) { return Rc::new(ItemResult { @@ -2487,6 +2498,7 @@ let item = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); Rc::new(ItemResult { item: item, @@ -2524,6 +2536,7 @@ parse_type_body_after_eq(&tokens, &s, &name, &name_span, &start_span, &type_para has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); Rc::new(ItemResult { item: item, @@ -2560,6 +2573,7 @@ let named_dummy = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let s = skip_newlines(tokens.clone(), prefix.state.clone()); let e = eat(&tokens, &s, Rc::new(ExpectedToken::ExpectLBrace)); @@ -2601,6 +2615,7 @@ let item = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); Rc::new(ItemResult { item: item, @@ -2638,6 +2653,7 @@ parse_type_body_after_eq(&tokens, &s, &name, &name_span, &start_span, &type_para has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); Rc::new(ItemResult { item: item, @@ -2671,6 +2687,7 @@ pub fn parse_type_body_after_eq(tokens: &Rc>>, state: &Rc>>, state: Rc, st has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let r = expect_ident(&tokens, &state); if has_err(r.err.clone()) { @@ -3997,6 +4025,7 @@ let named_dummy = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let r = parse_params(&tokens, r.state.clone()); if has_err(r.err.clone()) { @@ -4045,6 +4074,7 @@ let item = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); Rc::new(ItemResult { item: item, @@ -4080,6 +4110,7 @@ let named_dummy = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let r = parse_block(&tokens, &skip_newlines(tokens.clone(), prefix.state.clone())); if has_err(r.err.clone()) { @@ -4108,6 +4139,7 @@ let item = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); Rc::new(ItemResult { item: item, @@ -4138,6 +4170,7 @@ let dummy = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let kw = tok_keyword_text(peek(tokens.clone(), state.clone())); let r = if (kw.clone().as_str() == "func".to_string().as_str()) { @@ -4211,6 +4244,7 @@ pub fn parse_block_item_after_kw(tokens: &Rc>>, state: Rc, start_span: Rc>>, state: Rc>>, state: Rc>>, state: Rc, has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let r = expect_ident(&tokens, &state); if has_err(r.err.clone()) { @@ -7287,6 +7337,7 @@ let named_dummy = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let r = expect(&tokens, &r.state.clone(), &Rc::new(ExpectedToken::ExpectColon)); if has_err(r.err.clone()) { @@ -7339,6 +7390,7 @@ let item = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); Rc::new(ItemResult { item: item, @@ -7731,6 +7783,7 @@ let node = Rc::new(Node { 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: 0, }); Rc::new(ExprResult { expr: node.clone(), @@ -7824,6 +7877,7 @@ let node = Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::ExprLet), + ident: 0, }); Rc::new(ExprResult { expr: node, @@ -7888,6 +7942,7 @@ if ((cr.constraints.clone().len() as i64) > 0) { 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: 0, }); Rc::new(ExprResult { expr: node.clone(), diff --git a/src/v2/stage0/src/v2_std_core.rs b/src/v2/stage0/src/v2_std_core.rs index b7f57f28b68..18e474c3e26 100644 --- a/src/v2/stage0/src/v2_std_core.rs +++ b/src/v2/stage0/src/v2_std_core.rs @@ -512,6 +512,7 @@ pub struct DeclaredFuncEnv { #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct Node { pub name: String, + pub ident: i64, pub span: Rc, pub ident_span: Option>, pub children: Rc>>, @@ -564,6 +565,7 @@ pub fn make_expr_node(expr_data: Rc, children: Rc>>, infe has_non_tail_self_call: false, match_pattern: None, expr_data: expr_data, + ident: 0, }) } @@ -586,6 +588,7 @@ pub fn make_named_expr_node(name: &String, expr_data: Rc, children: Rc has_non_tail_self_call: false, match_pattern: None, expr_data: expr_data, + ident: 0, }) } @@ -614,6 +617,7 @@ pub fn make_expr_error_node(kind: ExprErrorKind, message: &String, span: &Rc, span: Rc, span: Rc has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -747,6 +755,7 @@ pub fn make_field_binding_node(field_name: &String, binding: Rc, s has_non_tail_self_call: false, match_pattern: Some(binding), expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -784,6 +793,7 @@ pub fn make_text_part_node(text: String, span: Rc) -> Rc { value: text, }), }), + ident: 0, }) } @@ -806,6 +816,7 @@ pub fn make_interp_part_node(expr: Rc, span: Rc) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -833,6 +844,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -921,6 +933,7 @@ let props = match from_key { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, })]), None => Rc::new(vec![]), }; @@ -942,6 +955,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -999,6 +1013,7 @@ pub fn make_variant_node(name: &String, fields: Rc>>, span: Rc>>, children: Rc>>, env: Rc>>, std has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }); let zero_span = make_span(0, 0); let stdin_props = match stdin { @@ -1565,6 +1582,7 @@ Rc::new(Node { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } } @@ -1718,6 +1736,7 @@ pub fn map_children(node: &Rc, transform: impl Fn(Rc) -> Rc + 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: 0, }) } @@ -1871,6 +1890,7 @@ pub fn module_node(name: &String, imports: Rc>>, items: Rc) -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) } @@ -1980,6 +2003,7 @@ pub fn unit_type() -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) }; } @@ -2007,6 +2031,7 @@ pub fn bool_type() -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) }; } @@ -2034,6 +2059,7 @@ pub fn string_type() -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) }; } @@ -2061,6 +2087,7 @@ pub fn int_type() -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) }; } @@ -2088,6 +2115,7 @@ pub fn float_type() -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) }; } @@ -2115,6 +2143,7 @@ pub fn none_type() -> Rc { has_non_tail_self_call: false, match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), + ident: 0, }) }; } @@ -2157,6 +2186,7 @@ pub fn error_type() -> Rc { kind: ExprErrorKind::SemanticExprError, message: "unresolved type".to_string(), }), + ident: 0, }) }; } @@ -2348,6 +2378,7 @@ pub fn with_optional_cardinality(n: &Rc) -> Rc { 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: 0, }) } @@ -2370,5 +2401,6 @@ pub fn with_required_cardinality(n: &Rc) -> Rc { 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: 0, }) } diff --git a/src/v2/tests/src/infer_semantics.rs b/src/v2/tests/src/infer_semantics.rs index 8a658b67b3f..ebff4117c0b 100644 --- a/src/v2/tests/src/infer_semantics.rs +++ b/src/v2/tests/src/infer_semantics.rs @@ -29,10 +29,12 @@ fn container_node(kind_name: String, element: Rc) -> Rc { let sp = make_span(0, 0); Rc::new(Node { name: kind_name.clone(), + ident: 0, span: sp.clone(), ident_span: default_ident_span(kind_name, sp.clone()), children: Rc::new(vec![Rc::new(Node { name: param_name.clone(), + ident: 0, span: sp.clone(), ident_span: default_ident_span(param_name, sp.clone()), children: Rc::new(vec![]), @@ -66,11 +68,12 @@ fn map_node(key: Rc, value: Rc) -> Rc { let sp = make_span(0, 0); Rc::new(Node { name: "Map".to_string(), + ident: 0, span: sp.clone(), ident_span: Some(sp.clone()), children: Rc::new(vec![ Rc::new(Node { - name: key_name, span: sp.clone(), + name: key_name, ident: 0, span: sp.clone(), ident_span: Some(sp.clone()), children: Rc::new(vec![]), connective: Connective::NoConnective, params: Rc::new(vec![]), @@ -81,7 +84,7 @@ fn map_node(key: Rc, value: Rc) -> Rc { match_pattern: None, expr_data: Rc::new(ExprData::NoExprData), }), Rc::new(Node { - name: val_name, span: sp.clone(), + name: val_name, ident: 0, span: sp.clone(), ident_span: Some(sp.clone()), children: Rc::new(vec![]), connective: Connective::NoConnective, params: Rc::new(vec![]), @@ -327,6 +330,7 @@ fn optional_match_exhaustiveness_accepts_some_and_none() { fn resolve_node_uses_node_name_for_lookup() { let node_ref = Rc::new(Node { name: "User".to_string(), + ident: 0, span: zero_span(), ident_span: Some(Rc::new(v2_compiler::v2_std_core::SourceSpan { file: "".to_string(), start: 0, end: 0 })), children: Rc::new(vec![]),