@@ -483,6 +483,49 @@ let type_resolving_visitor
483
483
inner.Walk. visit_stmt_pre stmt
484
484
in
485
485
486
+ let rebuilt_pexps = Hashtbl. create 0 in
487
+ let get_rebuilt_pexp p =
488
+ Hashtbl. find rebuilt_pexps p.id
489
+ in
490
+
491
+ let visit_pexp_post p =
492
+ let rebuild_plval pl =
493
+ match pl with
494
+ Ast. PLVAL_ident _ -> pl
495
+ | Ast. PLVAL_app (id , tys ) ->
496
+ Ast. PLVAL_app (id, Array. map resolve_ty tys)
497
+ | Ast. PLVAL_ext_name (pexp , nc ) ->
498
+ let pexp = get_rebuilt_pexp pexp in
499
+ let nc =
500
+ match nc with
501
+ Ast. COMP_ident _
502
+ | Ast. COMP_idx _ -> nc
503
+ | Ast. COMP_app (id , tys ) ->
504
+ Ast. COMP_app (id, Array. map resolve_ty tys)
505
+ in
506
+ Ast. PLVAL_ext_name (pexp, nc)
507
+
508
+ | Ast. PLVAL_ext_pexp (a , b ) ->
509
+ Ast. PLVAL_ext_pexp (get_rebuilt_pexp a,
510
+ get_rebuilt_pexp b)
511
+ | Ast. PLVAL_ext_deref p ->
512
+ Ast. PLVAL_ext_deref (get_rebuilt_pexp p)
513
+ in
514
+ let p =
515
+ match p.node with
516
+ Ast. PEXP_lval pl ->
517
+ let pl' = rebuild_plval pl in
518
+ iflog cx (fun _ -> log cx " rebuilt plval %a as %a (#%d)"
519
+ Ast. sprintf_plval pl Ast. sprintf_plval pl'
520
+ (int_of_node p.id));
521
+ { p with node = Ast. PEXP_lval pl' }
522
+
523
+ | _ -> p
524
+ in
525
+ htab_put rebuilt_pexps p.id p
526
+ in
527
+
528
+
486
529
let visit_lval_pre lv =
487
530
let rec rebuild_lval ' lv =
488
531
match lv with
@@ -539,6 +582,7 @@ let type_resolving_visitor
539
582
Walk. visit_obj_drop_pre = visit_obj_drop_pre;
540
583
Walk. visit_stmt_pre = visit_stmt_pre;
541
584
Walk. visit_lval_pre = visit_lval_pre;
585
+ Walk. visit_pexp_post = visit_pexp_post;
542
586
Walk. visit_crate_post = visit_crate_post }
543
587
;;
544
588
0 commit comments