rue_compiler/compile/binding/
struct_binding.rs

1use 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}