mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 00:24:34 +00:00
record update foundations
This commit is contained in:
parent
c8e5acf142
commit
16ec417324
4 changed files with 71 additions and 1 deletions
|
@ -1035,6 +1035,8 @@ pub fn build_exp_expr<'a, 'ctx, 'env>(
|
|||
Reset(_) => todo!(),
|
||||
Reuse { .. } => todo!(),
|
||||
|
||||
Update { .. } => todo!(),
|
||||
|
||||
AccessAtIndex {
|
||||
index,
|
||||
structure,
|
||||
|
|
|
@ -337,6 +337,7 @@ impl<'a> BorrowInfState<'a> {
|
|||
self.own_var(*x);
|
||||
}
|
||||
}
|
||||
Update { .. } => todo!(),
|
||||
FunctionCall {
|
||||
call_type,
|
||||
args,
|
||||
|
|
|
@ -100,6 +100,13 @@ pub fn occuring_variables_expr(expr: &Expr<'_>, result: &mut MutSet<Symbol>) {
|
|||
result.insert(*symbol);
|
||||
}
|
||||
|
||||
Update {
|
||||
structure, updates, ..
|
||||
} => {
|
||||
result.insert(*structure);
|
||||
result.extend(updates.iter().map(|r| r.1));
|
||||
}
|
||||
|
||||
FunctionCall { args, .. } => {
|
||||
// NOTE thouth the function name does occur, it is a static constant in the program
|
||||
// for liveness, it should not be included here.
|
||||
|
@ -456,6 +463,8 @@ impl<'a> Context<'a> {
|
|||
self.arena.alloc(Stmt::Let(z, v, l, b))
|
||||
}
|
||||
|
||||
Update { .. } => todo!(),
|
||||
|
||||
RunLowLevel(op, args) => {
|
||||
let ps = crate::borrow::lowlevel_borrow_signature(self.arena, op);
|
||||
let b = self.add_dec_after_lowlevel(args, ps, b, b_live_vars);
|
||||
|
|
|
@ -680,12 +680,18 @@ pub enum Expr<'a> {
|
|||
arguments: &'a [Symbol],
|
||||
},
|
||||
Struct(&'a [Symbol]),
|
||||
|
||||
AccessAtIndex {
|
||||
index: u64,
|
||||
field_layouts: &'a [Layout<'a>],
|
||||
structure: Symbol,
|
||||
wrapped: Wrapped,
|
||||
},
|
||||
Update {
|
||||
structure: Symbol,
|
||||
field_layouts: &'a [Layout<'a>],
|
||||
updates: &'a [(u64, Symbol)],
|
||||
},
|
||||
|
||||
Array {
|
||||
elem_layout: Layout<'a>,
|
||||
|
@ -846,6 +852,23 @@ impl<'a> Expr<'a> {
|
|||
.text(format!("Index {} ", index))
|
||||
.append(symbol_to_doc(alloc, *structure)),
|
||||
|
||||
Update {
|
||||
structure, updates, ..
|
||||
} => {
|
||||
let it = updates.iter().map(|(index, symbol)| {
|
||||
alloc
|
||||
.text(format!(".{} => ", index))
|
||||
.append(symbol_to_doc(alloc, *symbol))
|
||||
});
|
||||
|
||||
alloc
|
||||
.text("Update ")
|
||||
.append(symbol_to_doc(alloc, *structure))
|
||||
.append(alloc.text("{ "))
|
||||
.append(alloc.intersperse(it, ", "))
|
||||
.append(alloc.text(" }"))
|
||||
}
|
||||
|
||||
RuntimeErrorFunction(s) => alloc.text(format!("ErrorFunction {}", s)),
|
||||
}
|
||||
}
|
||||
|
@ -2017,7 +2040,12 @@ pub fn with_hole<'a>(
|
|||
}
|
||||
}
|
||||
|
||||
Update { .. } => todo!("record access/accessor/update"),
|
||||
Update {
|
||||
record_var, // Variable,
|
||||
ext_var, // Variable,
|
||||
symbol, // Symbol,
|
||||
updates, // SendMap<Lowercase, Field>,
|
||||
} => todo!("record access/accessor/update"),
|
||||
|
||||
Closure {
|
||||
function_type,
|
||||
|
@ -2965,6 +2993,36 @@ fn substitute_in_expr<'a>(
|
|||
}),
|
||||
None => None,
|
||||
},
|
||||
|
||||
Update {
|
||||
structure,
|
||||
field_layouts,
|
||||
updates,
|
||||
} => {
|
||||
let mut did_change = false;
|
||||
let new_updates = Vec::from_iter_in(
|
||||
updates.iter().map(|(index, s)| match substitute(subs, *s) {
|
||||
None => (*index, *s),
|
||||
Some(s) => {
|
||||
did_change = true;
|
||||
(*index, s)
|
||||
}
|
||||
}),
|
||||
arena,
|
||||
);
|
||||
|
||||
if did_change {
|
||||
let updates = new_updates.into_bump_slice();
|
||||
|
||||
Some(Update {
|
||||
structure: *structure,
|
||||
field_layouts,
|
||||
updates,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue