chore: throwaway mode-migration tool for the Implicit cutover (#55, 0121 task 3)
Adds `ail migrate-modes <file>` (a throwaway CLI subcommand) and the AST walker `ailang_core::ast::for_each_fn_type_mut` it drives: parse a .ail, map every bare/Implicit fn-type slot to Own, preserve explicit Own/Borrow, print back. Semantically invisible today (PartialEq treats Implicit == Own), but it materialises the modes so the post-cutover parser — which will reject bare slots — accepts the migrated corpus. Both are throwaway: removed in task 4 once ParamMode::Implicit is deleted (the closure references Implicit and would not compile). RED-first: migrate_modes.rs failed to compile (missing walker) before for_each_fn_type_mut was added. Additive; full workspace suite green. refs #55
This commit is contained in:
@@ -846,6 +846,34 @@ impl Type {
|
||||
}
|
||||
}
|
||||
|
||||
/// Visit every `Type::Fn` in `m`, letting `f` rewrite its modes.
|
||||
/// `f(params_len, param_modes, ret_mode)`. Used by the throwaway
|
||||
/// `migrate-modes` tool (spec 0062); has no other caller and is
|
||||
/// removed if the migration machinery is retired.
|
||||
pub fn for_each_fn_type_mut(
|
||||
m: &mut Module,
|
||||
f: &mut impl FnMut(usize, &mut Vec<ParamMode>, &mut ParamMode),
|
||||
) {
|
||||
fn walk_ty(t: &mut Type, f: &mut impl FnMut(usize, &mut Vec<ParamMode>, &mut ParamMode)) {
|
||||
match t {
|
||||
Type::Fn { params, param_modes, ret, ret_mode, .. } => {
|
||||
let n = params.len();
|
||||
for p in params.iter_mut() { walk_ty(p, f); }
|
||||
walk_ty(ret, f);
|
||||
f(n, param_modes, ret_mode);
|
||||
}
|
||||
Type::Con { args, .. } => { for a in args.iter_mut() { walk_ty(a, f); } }
|
||||
Type::Forall { body, .. } => walk_ty(body, f),
|
||||
Type::Var { .. } => {}
|
||||
}
|
||||
}
|
||||
for def in m.defs.iter_mut() {
|
||||
if let Def::Fn(fd) = def {
|
||||
walk_ty(&mut fd.ty, f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Per-parameter / return mode marker on a [`Type::Fn`]. Full
|
||||
/// contract lives in `design/contracts/0008-memory-model.md`.
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user