Add a pexp-rebuild phase to the type resolution pass in resolve.ml.

This commit is contained in:
Graydon Hoare 2010-09-16 12:17:56 -07:00
parent 01a76e21a6
commit c4c73e09f1
2 changed files with 46 additions and 0 deletions

View File

@ -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;;

View File

@ -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 }
;;