ok I still think this will work
1 files changed, 85 insertions(+), 13 deletions(-)

M src/hir2/lower.rs
M src/hir2/lower.rs +85 -13
@@ 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);
+        }
+    }
 }