rue_compiler/compile/binding/
struct_binding.rs1use rue_ast::AstStructBinding;
2use rue_hir::{BindingSymbol, Declaration, Hir, Symbol, SymbolId, SymbolPath, Value};
3
4use crate::{Compiler, compile_named_field, create_binding, create_binding_for_identifier};
5
6pub fn create_struct_binding(
7 ctx: &mut Compiler,
8 symbol: SymbolId,
9 struct_binding: &AstStructBinding,
10) {
11 let ty = ctx.symbol_type(symbol);
12 let reference = Value::new(ctx.alloc_hir(Hir::Reference(symbol)), ty)
13 .with_reference(SymbolPath::new(symbol, vec![]));
14
15 for field in struct_binding.fields() {
16 let Some(name) = field.name() else {
17 continue;
18 };
19
20 let value = compile_named_field(ctx, &reference, &name);
21
22 let binding_symbol = ctx.alloc_symbol(Symbol::Binding(BindingSymbol {
23 name: None,
24 value,
25 inline: true,
26 }));
27 ctx.push_declaration(Declaration::Symbol(binding_symbol));
28 ctx.reference(Declaration::Symbol(symbol));
29
30 if let Some(binding) = field.binding() {
31 create_binding(ctx, binding_symbol, &binding);
32 } else {
33 create_binding_for_identifier(ctx, binding_symbol, name);
34 }
35
36 ctx.pop_declaration();
37 }
38}