# HG changeset patch # User Simon Heath # Date 1736719593 18000 # Sun Jan 12 17:06:33 2025 -0500 # Branch devel # Node ID 1c0036922cf3790174211941ede557a66a952803 # Parent 8767d46ebd0d89b18ca9749b65e91095da799c61 ok I still think this will work diff --git a/src/hir2/lower.rs b/src/hir2/lower.rs --- a/src/hir2/lower.rs +++ b/src/hir2/lower.rs @@ -672,24 +672,34 @@ fn visit_sig(&mut self, sig: &Sig) -> Sig { self.vars += sig.params.len(); self.type_vars += sig.typeparams.len(); - sig.clone() + super::visit::walk_sig(self, sig) + } +} + +#[derive(Default)] +struct IndexRenamer { + next_var_idx: usize, +} + +impl super::visit::Visit for IndexRenamer { + fn visit(&mut self, ir: &Ir) -> Ir { + let mut counter = IndexCounter::default(); + counter.visit(ir); + self.next_var_idx = counter.vars; + super::visit::walk(self, ir) } - // fn visit_lambda(&mut self, sig: &Sig, body: &[ENode]) -> Expr { - // todo!(); - // super::visit::walk_lambda(self, sig, body) - // } + fn visit_sig(&mut self, sig: &Sig) -> Sig { + todo!(); + super::visit::walk_sig(self, sig) + } - // fn visit_decl_function(&mut self, name: Sym, sig: &Sig, body: &[ENode]) -> Function { - // todo!(); - // super::visit::walk_decl_function(self, name, sig, body) - // } + fn visit_let(&mut self, varname: Sym, typename: &Type, init: &ENode, mutable: bool) -> Expr { + todo!(); + super::visit::walk_let(self, varname, typename, init, mutable) + } } -struct IndexRenamer {} - -impl super::visit::Visit for IndexRenamer {} - /// Just does a sanity-check pass through the HIR and makes sure /// all our Idx's have been filled in to something other than Idx::invalid(). /// @@ -902,4 +912,66 @@ assert_eq!(ctr.type_vars, typevarcount); } } + + #[test] + fn test_index_vars() { + let programs = vec![ + ( + r#" +fn foo() = + let x = 3 + let y = x + x = 4 + y = y + 5 +end + "#, + 2, + 0, + ), + ( + r#" +fn foo() = + let x = 3 + let bar = fn(a I32) I32 = + let z = 99 + z + end + let y = x + x = 4 + y = y + 5 +end + "#, + 5, + 0, + ), + ( + r#" +fn foo(|T1, T2| a T1, y T2) = + let x = 3 + let bar = fn(a I32) I32 = + let z = 99 + z + end + let y = x + x = 4 + y = y + 5 +end + "#, + 7, + 2, + ), + ]; + use crate::hir2::visit::Visit; + for (prog, varcount, typevarcount) in programs { + let ast = { + let mut parser = parser::Parser::new("hir2/lower.rs", prog); + parser.parse() + }; + let ir = lower(&ast); + let mut ctr = IndexRenamer::default(); + ctr.visit(&ir); + assert_eq!(ctr.vars, varcount); + assert_eq!(ctr.type_vars, typevarcount); + } + } }