about summary refs log tree commit diff
path: root/src/boot
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2010-09-16 12:17:56 -0700
committerGraydon Hoare <graydon@mozilla.com>2010-09-16 12:34:07 -0700
commitc4c73e09f1a25c8a9d9c69a3243d9342037fed73 (patch)
tree9d0a0af1e32298d4a4cd47eb1ab03edf594f9303 /src/boot
parent01a76e21a62041b50f746969e69c60e79e7e8b44 (diff)
Add a pexp-rebuild phase to the type resolution pass in resolve.ml.
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/fe/ast.ml2
-rw-r--r--src/boot/me/resolve.ml44
2 files changed, 46 insertions, 0 deletions
diff --git a/src/boot/fe/ast.ml b/src/boot/fe/ast.ml
index adc6f60d72e..efb64e50c98 100644
--- a/src/boot/fe/ast.ml
+++ b/src/boot/fe/ast.ml
@@ -1749,6 +1749,8 @@ let sprintf_expr = sprintf_fmt fmt_expr;;
 let sprintf_name = sprintf_fmt fmt_name;;
 let sprintf_name_component = sprintf_fmt fmt_name_component;;
 let sprintf_lval = sprintf_fmt fmt_lval;;
+let sprintf_plval = sprintf_fmt fmt_plval;;
+let sprintf_pexp = sprintf_fmt fmt_pexp;;
 let sprintf_atom = sprintf_fmt fmt_atom;;
 let sprintf_slot = sprintf_fmt fmt_slot;;
 let sprintf_slot_key = sprintf_fmt fmt_slot_key;;
diff --git a/src/boot/me/resolve.ml b/src/boot/me/resolve.ml
index 1be2e3b9b35..7cb11d1ff62 100644
--- a/src/boot/me/resolve.ml
+++ b/src/boot/me/resolve.ml
@@ -483,6 +483,49 @@ let type_resolving_visitor
     inner.Walk.visit_stmt_pre stmt
   in
 
+  let rebuilt_pexps = Hashtbl.create 0 in
+  let get_rebuilt_pexp p =
+    Hashtbl.find rebuilt_pexps p.id
+  in
+
+  let visit_pexp_post p =
+    let rebuild_plval pl =
+      match pl with
+          Ast.PLVAL_ident _ -> pl
+        | Ast.PLVAL_app (id, tys) ->
+            Ast.PLVAL_app (id, Array.map resolve_ty tys)
+        | Ast.PLVAL_ext_name (pexp, nc) ->
+            let pexp = get_rebuilt_pexp pexp in
+            let nc =
+              match nc with
+                  Ast.COMP_ident _
+                | Ast.COMP_idx _ -> nc
+                | Ast.COMP_app (id, tys) ->
+                    Ast.COMP_app (id, Array.map resolve_ty tys)
+            in
+              Ast.PLVAL_ext_name (pexp, nc)
+
+        | Ast.PLVAL_ext_pexp (a, b) ->
+            Ast.PLVAL_ext_pexp (get_rebuilt_pexp a,
+                                get_rebuilt_pexp b)
+        | Ast.PLVAL_ext_deref p ->
+            Ast.PLVAL_ext_deref (get_rebuilt_pexp p)
+    in
+    let p =
+      match p.node with
+          Ast.PEXP_lval pl ->
+            let pl' = rebuild_plval pl in
+              iflog cx (fun _ -> log cx "rebuilt plval %a as %a (#%d)"
+                          Ast.sprintf_plval pl Ast.sprintf_plval pl'
+                          (int_of_node p.id));
+              { p with node = Ast.PEXP_lval pl' }
+
+        | _ -> p
+    in
+      htab_put rebuilt_pexps p.id p
+  in
+
+
   let visit_lval_pre lv =
     let rec rebuild_lval' lv =
       match lv with
@@ -539,6 +582,7 @@ let type_resolving_visitor
         Walk.visit_obj_drop_pre = visit_obj_drop_pre;
         Walk.visit_stmt_pre = visit_stmt_pre;
         Walk.visit_lval_pre = visit_lval_pre;
+        Walk.visit_pexp_post = visit_pexp_post;
         Walk.visit_crate_post = visit_crate_post }
 ;;