@@ 672,24 672,34 @@ impl super::visit::Visit for IndexCounte
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 @@ end
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);
+ }
+ }
}