about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-05-13 11:31:27 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-05-13 11:35:25 +0200
commit7082bf4478d3c4dab5a46bf2df18b57a496023f4 (patch)
tree951267554233423ee965f691d3c2a71bdef8a21c
parent39a000714a14fb907b7a34573684191804d28277 (diff)
downloadrust-7082bf4478d3c4dab5a46bf2df18b57a496023f4.tar.gz
rust-7082bf4478d3c4dab5a46bf2df18b57a496023f4.zip
Ensure visit_ty is called on type parameters during walk
-rw-r--r--src/comp/middle/walk.rs27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/comp/middle/walk.rs b/src/comp/middle/walk.rs
index 43695b32596..8a3c72f43e4 100644
--- a/src/comp/middle/walk.rs
+++ b/src/comp/middle/walk.rs
@@ -170,13 +170,31 @@ fn walk_ty(&ast_visitor v, @ast::ty t) {
                 walk_ty(v, m.output);
             }
         }
-        case (ast::ty_path(_, _)) {}
+        case (ast::ty_path(?p, _)) {
+            for (@ast::ty tp in p.node.types) {
+                walk_ty(v, tp);
+            }
+        }
         case (ast::ty_type) {}
         case (ast::ty_constr(?t, _)) { walk_ty(v, t); }
     }
     v.visit_ty_post(t);
 }
 
+fn walk_pat(&ast_visitor v, &@ast::pat p) {
+    alt (p.node) {
+        case (ast::pat_tag(?path, ?children, _)) {
+            for (@ast::ty tp in path.node.types) {
+                walk_ty(v, tp);
+            }
+            for (@ast::pat child in children) {
+                walk_pat(v, child);
+            }
+        }
+        case (_) {}
+    }
+}
+
 fn walk_native_mod(&ast_visitor v, &ast::native_mod nm) {
     if (!v.keep_going()) { ret; }
     for (@ast::view_item vi in nm.view_items) {
@@ -349,6 +367,7 @@ fn walk_expr(&ast_visitor v, @ast::expr e) {
         case (ast::expr_alt(?x, ?arms, _)) {
             walk_expr(v, x);
             for (ast::arm a in arms) {
+                walk_pat(v, a.pat);
                 v.visit_arm_pre(a);
                 walk_block(v, a.block);
                 v.visit_arm_post(a);
@@ -380,7 +399,11 @@ fn walk_expr(&ast_visitor v, @ast::expr e) {
             walk_expr(v, a);
             walk_expr(v, b);
         }
-        case (ast::expr_path(_, _)) { }
+        case (ast::expr_path(?p, _)) {
+            for (@ast::ty tp in p.node.types) {
+                walk_ty(v, tp);
+            }
+        }
         case (ast::expr_ext(_, ?args, ?body, ?expansion, _)) {
             // Only walk expansion, not args/body.
             walk_expr(v, expansion);