@@ -288,6 +288,9 @@ type ast_fold[ENV] =
288
288
289
289
( fn ( & ENV e, & span sp, ident i) -> @view_item) fold_view_item_export,
290
290
291
+ // Annotation folds.
292
+ ( fn ( & ENV e, ann a) -> ann) fold_ann,
293
+
291
294
// Additional nodes.
292
295
( fn ( & ENV e, & span sp,
293
296
& ast. block_ ) -> block) fold_block,
@@ -536,15 +539,17 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
536
539
alt ( e. node ) {
537
540
case ( ast. expr_vec ( ?es, ?mut , ?t) ) {
538
541
auto ees = fold_exprs ( env_, fld, es) ;
539
- ret fld. fold_expr_vec ( env_, e. span , ees, mut, t) ;
542
+ auto t2 = fld. fold_ann ( env_, t) ;
543
+ ret fld. fold_expr_vec ( env_, e. span , ees, mut, t2) ;
540
544
}
541
545
542
546
case ( ast. expr_tup ( ?es, ?t) ) {
543
547
let vec[ ast. elt ] elts = vec ( ) ;
544
548
for ( ast. elt e in es) {
545
549
elts += vec ( fold_tup_elt[ ENV ] ( env, fld, e) ) ;
546
550
}
547
- ret fld. fold_expr_tup ( env_, e. span , elts, t) ;
551
+ auto t2 = fld. fold_ann ( env_, t) ;
552
+ ret fld. fold_expr_tup ( env_, e. span , elts, t2) ;
548
553
}
549
554
550
555
case ( ast. expr_rec ( ?fs, ?base, ?t) ) {
@@ -559,17 +564,20 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
559
564
b = some[ @expr] ( fold_expr ( env_, fld, eb) ) ;
560
565
}
561
566
}
562
- ret fld. fold_expr_rec ( env_, e. span , fields, b, t) ;
567
+ auto t2 = fld. fold_ann ( env_, t) ;
568
+ ret fld. fold_expr_rec ( env_, e. span , fields, b, t2) ;
563
569
}
564
570
565
571
case ( ast. expr_call ( ?f, ?args, ?t) ) {
566
572
auto ff = fold_expr ( env_, fld, f) ;
567
573
auto aargs = fold_exprs ( env_, fld, args) ;
568
- ret fld. fold_expr_call ( env_, e. span , ff, aargs, t) ;
574
+ auto t2 = fld. fold_ann ( env_, t) ;
575
+ ret fld. fold_expr_call ( env_, e. span , ff, aargs, t2) ;
569
576
}
570
577
571
578
case ( ast. expr_self_method ( ?ident, ?t) ) {
572
- ret fld. fold_expr_self_method ( env_, e. span , ident, t) ;
579
+ auto t2 = fld. fold_ann ( env_, t) ;
580
+ ret fld. fold_expr_self_method ( env_, e. span , ident, t2) ;
573
581
}
574
582
575
583
case ( ast. expr_bind ( ?f, ?args_opt, ?t) ) {
@@ -586,34 +594,40 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
586
594
case ( none[ @ast. expr] ) { /* empty */ }
587
595
}
588
596
}
589
- ret fld. fold_expr_bind( env_, e. span, ff, aargs_opt, t) ;
597
+ auto t2 = fld. fold_ann( env_, t) ;
598
+ ret fld. fold_expr_bind( env_, e. span, ff, aargs_opt, t2) ;
590
599
}
591
600
592
601
case ( ast. expr_spawn( ?dom, ?name, ?f, ?args, ?t) ) {
593
602
auto ff = fold_expr( env_, fld, f) ;
594
603
auto aargs = fold_exprs( env_, fld, args) ;
595
- ret fld. fold_expr_spawn( env_, e. span, dom, name, ff, aargs, t) ;
604
+ auto t2 = fld. fold_ann( env_, t) ;
605
+ ret fld. fold_expr_spawn( env_, e. span, dom, name, ff, aargs, t2) ;
596
606
}
597
607
598
608
case ( ast. expr_binary( ?op, ?a, ?b, ?t) ) {
599
609
auto aa = fold_expr( env_, fld, a) ;
600
610
auto bb = fold_expr( env_, fld, b) ;
601
- ret fld. fold_expr_binary( env_, e. span, op, aa, bb, t) ;
611
+ auto t2 = fld. fold_ann( env_, t) ;
612
+ ret fld. fold_expr_binary( env_, e. span, op, aa, bb, t2) ;
602
613
}
603
614
604
615
case ( ast. expr_unary( ?op, ?a, ?t) ) {
605
616
auto aa = fold_expr( env_, fld, a) ;
606
- ret fld. fold_expr_unary( env_, e. span, op, aa, t) ;
617
+ auto t2 = fld. fold_ann( env_, t) ;
618
+ ret fld. fold_expr_unary( env_, e. span, op, aa, t2) ;
607
619
}
608
620
609
621
case ( ast. expr_lit( ?lit, ?t) ) {
610
- ret fld. fold_expr_lit( env_, e. span, lit, t) ;
622
+ auto t2 = fld. fold_ann( env_, t) ;
623
+ ret fld. fold_expr_lit( env_, e. span, lit, t2) ;
611
624
}
612
625
613
626
case ( ast. expr_cast( ?e, ?t, ?at) ) {
614
627
auto ee = fold_expr( env_, fld, e) ;
615
628
auto tt = fold_ty( env, fld, t) ;
616
- ret fld. fold_expr_cast( env_, e. span, ee, tt, at) ;
629
+ auto at2 = fld. fold_ann( env_, at) ;
630
+ ret fld. fold_expr_cast( env_, e. span, ee, tt, at2) ;
617
631
}
618
632
619
633
case ( ast. expr_if( ?cnd, ?thn, ?els, ?t) ) {
@@ -626,33 +640,38 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
626
640
}
627
641
case ( _) { /* fall through */ }
628
642
}
629
- ret fld. fold_expr_if( env_, e. span, ccnd, tthn, eels, t) ;
643
+ auto t2 = fld. fold_ann( env_, t) ;
644
+ ret fld. fold_expr_if( env_, e. span, ccnd, tthn, eels, t2) ;
630
645
}
631
646
632
647
case ( ast. expr_for( ?decl, ?seq, ?body, ?t) ) {
633
648
auto ddecl = fold_decl( env_, fld, decl) ;
634
649
auto sseq = fold_expr( env_, fld, seq) ;
635
650
auto bbody = fold_block( env_, fld, body) ;
636
- ret fld. fold_expr_for( env_, e. span, ddecl, sseq, bbody, t) ;
651
+ auto t2 = fld. fold_ann( env_, t) ;
652
+ ret fld. fold_expr_for( env_, e. span, ddecl, sseq, bbody, t2) ;
637
653
}
638
654
639
655
case ( ast. expr_for_each( ?decl, ?seq, ?body, ?t) ) {
640
656
auto ddecl = fold_decl( env_, fld, decl) ;
641
657
auto sseq = fold_expr( env_, fld, seq) ;
642
658
auto bbody = fold_block( env_, fld, body) ;
643
- ret fld. fold_expr_for_each( env_, e. span, ddecl, sseq, bbody, t) ;
659
+ auto t2 = fld. fold_ann( env_, t) ;
660
+ ret fld. fold_expr_for_each( env_, e. span, ddecl, sseq, bbody, t2) ;
644
661
}
645
662
646
663
case ( ast. expr_while( ?cnd, ?body, ?t) ) {
647
664
auto ccnd = fold_expr( env_, fld, cnd) ;
648
665
auto bbody = fold_block( env_, fld, body) ;
649
- ret fld. fold_expr_while( env_, e. span, ccnd, bbody, t) ;
666
+ auto t2 = fld. fold_ann( env_, t) ;
667
+ ret fld. fold_expr_while( env_, e. span, ccnd, bbody, t2) ;
650
668
}
651
669
652
670
case ( ast. expr_do_while( ?body, ?cnd, ?t) ) {
653
671
auto bbody = fold_block( env_, fld, body) ;
654
672
auto ccnd = fold_expr( env_, fld, cnd) ;
655
- ret fld. fold_expr_do_while( env_, e. span, bbody, ccnd, t) ;
673
+ auto t2 = fld. fold_ann( env_, t) ;
674
+ ret fld. fold_expr_do_while( env_, e. span, bbody, ccnd, t2) ;
656
675
}
657
676
658
677
case ( ast. expr_alt( ?expr, ?arms, ?t) ) {
@@ -661,72 +680,85 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
661
680
for ( ast. arm a in arms) {
662
681
aarms += vec( fold_arm( env_, fld, a) ) ;
663
682
}
664
- ret fld. fold_expr_alt( env_, e. span, eexpr, aarms, t) ;
683
+ auto t2 = fld. fold_ann( env_, t) ;
684
+ ret fld. fold_expr_alt( env_, e. span, eexpr, aarms, t2) ;
665
685
}
666
686
667
687
case ( ast. expr_block( ?b, ?t) ) {
668
688
auto bb = fold_block( env_, fld, b) ;
669
- ret fld. fold_expr_block( env_, e. span, bb, t) ;
689
+ auto t2 = fld. fold_ann( env_, t) ;
690
+ ret fld. fold_expr_block( env_, e. span, bb, t2) ;
670
691
}
671
692
672
693
case ( ast. expr_assign( ?lhs, ?rhs, ?t) ) {
673
694
auto llhs = fold_expr( env_, fld, lhs) ;
674
695
auto rrhs = fold_expr( env_, fld, rhs) ;
675
- ret fld. fold_expr_assign( env_, e. span, llhs, rrhs, t) ;
696
+ auto t2 = fld. fold_ann( env_, t) ;
697
+ ret fld. fold_expr_assign( env_, e. span, llhs, rrhs, t2) ;
676
698
}
677
699
678
700
case ( ast. expr_assign_op( ?op, ?lhs, ?rhs, ?t) ) {
679
701
auto llhs = fold_expr( env_, fld, lhs) ;
680
702
auto rrhs = fold_expr( env_, fld, rhs) ;
681
- ret fld. fold_expr_assign_op( env_, e. span, op, llhs, rrhs, t) ;
703
+ auto t2 = fld. fold_ann( env_, t) ;
704
+ ret fld. fold_expr_assign_op( env_, e. span, op, llhs, rrhs, t2) ;
682
705
}
683
706
684
707
case ( ast. expr_send( ?lhs, ?rhs, ?t) ) {
685
708
auto llhs = fold_expr( env_, fld, lhs) ;
686
709
auto rrhs = fold_expr( env_, fld, rhs) ;
687
- ret fld. fold_expr_send( env_, e. span, llhs, rrhs, t) ;
710
+ auto t2 = fld. fold_ann( env_, t) ;
711
+ ret fld. fold_expr_send( env_, e. span, llhs, rrhs, t2) ;
688
712
}
689
713
690
714
case ( ast. expr_recv( ?lhs, ?rhs, ?t) ) {
691
715
auto llhs = fold_expr( env_, fld, lhs) ;
692
716
auto rrhs = fold_expr( env_, fld, rhs) ;
693
- ret fld. fold_expr_recv( env_, e. span, llhs, rrhs, t) ;
717
+ auto t2 = fld. fold_ann( env_, t) ;
718
+ ret fld. fold_expr_recv( env_, e. span, llhs, rrhs, t2) ;
694
719
}
695
720
696
721
case ( ast. expr_field( ?e, ?i, ?t) ) {
697
722
auto ee = fold_expr( env_, fld, e) ;
698
- ret fld. fold_expr_field( env_, e. span, ee, i, t) ;
723
+ auto t2 = fld. fold_ann( env_, t) ;
724
+ ret fld. fold_expr_field( env_, e. span, ee, i, t2) ;
699
725
}
700
726
701
727
case ( ast. expr_index( ?e, ?ix, ?t) ) {
702
728
auto ee = fold_expr( env_, fld, e) ;
703
729
auto iix = fold_expr( env_, fld, ix) ;
704
- ret fld. fold_expr_index( env_, e. span, ee, iix, t) ;
730
+ auto t2 = fld. fold_ann( env_, t) ;
731
+ ret fld. fold_expr_index( env_, e. span, ee, iix, t2) ;
705
732
}
706
733
707
734
case ( ast. expr_path( ?p, ?r, ?t) ) {
708
735
auto p_ = fold_path( env_, fld, p) ;
709
- ret fld. fold_expr_path( env_, e. span, p_, r, t) ;
736
+ auto t2 = fld. fold_ann( env_, t) ;
737
+ ret fld. fold_expr_path( env_, e. span, p_, r, t2) ;
710
738
}
711
739
712
740
case ( ast. expr_ext( ?p, ?args, ?body, ?expanded, ?t) ) {
713
741
// Only fold the expanded expression, not the
714
742
// expressions involved in syntax extension
715
743
auto exp = fold_expr( env_, fld, expanded) ;
744
+ auto t2 = fld. fold_ann( env_, t) ;
716
745
ret fld. fold_expr_ext( env_, e. span, p, args, body,
717
- exp, t ) ;
746
+ exp, t2 ) ;
718
747
}
719
748
720
749
case ( ast. expr_fail( ?t) ) {
721
- ret fld. fold_expr_fail( env_, e. span, t) ;
750
+ auto t2 = fld. fold_ann( env_, t) ;
751
+ ret fld. fold_expr_fail( env_, e. span, t2) ;
722
752
}
723
753
724
754
case ( ast. expr_break( ?t) ) {
725
- ret fld. fold_expr_break( env_, e. span, t) ;
755
+ auto t2 = fld. fold_ann( env_, t) ;
756
+ ret fld. fold_expr_break( env_, e. span, t2) ;
726
757
}
727
758
728
759
case ( ast. expr_cont( ?t) ) {
729
- ret fld. fold_expr_cont( env_, e. span, t) ;
760
+ auto t2 = fld. fold_ann( env_, t) ;
761
+ ret fld. fold_expr_cont( env_, e. span, t2) ;
730
762
}
731
763
732
764
case ( ast. expr_ret( ?oe, ?t) ) {
@@ -737,7 +769,8 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
737
769
}
738
770
case ( _) { /* fall through */ }
739
771
}
740
- ret fld. fold_expr_ret( env_, e. span, oee, t) ;
772
+ auto t2 = fld. fold_ann( env_, t) ;
773
+ ret fld. fold_expr_ret( env_, e. span, oee, t2) ;
741
774
}
742
775
743
776
case ( ast. expr_put( ?oe, ?t) ) {
@@ -748,31 +781,37 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
748
781
}
749
782
case ( _) { /* fall through */ }
750
783
}
751
- ret fld. fold_expr_put( env_, e. span, oee, t) ;
784
+ auto t2 = fld. fold_ann( env_, t) ;
785
+ ret fld. fold_expr_put( env_, e. span, oee, t2) ;
752
786
}
753
787
754
788
case ( ast. expr_be( ?x, ?t) ) {
755
789
auto ee = fold_expr( env_, fld, x) ;
756
- ret fld. fold_expr_be( env_, e. span, ee, t) ;
790
+ auto t2 = fld. fold_ann( env_, t) ;
791
+ ret fld. fold_expr_be( env_, e. span, ee, t2) ;
757
792
}
758
793
759
794
case ( ast. expr_log( ?x, ?t) ) {
760
795
auto ee = fold_expr( env_, fld, x) ;
761
- ret fld. fold_expr_log( env_, e. span, ee, t) ;
796
+ auto t2 = fld. fold_ann( env_, t) ;
797
+ ret fld. fold_expr_log( env_, e. span, ee, t2) ;
762
798
}
763
799
764
800
case ( ast. expr_check_expr( ?x, ?t) ) {
765
801
auto ee = fold_expr( env_, fld, x) ;
766
- ret fld. fold_expr_check_expr( env_, e. span, ee, t) ;
802
+ auto t2 = fld. fold_ann( env_, t) ;
803
+ ret fld. fold_expr_check_expr( env_, e. span, ee, t2) ;
767
804
}
768
805
769
806
case ( ast. expr_port( ?t) ) {
770
- ret fld. fold_expr_port( env_, e. span, t) ;
807
+ auto t2 = fld. fold_ann( env_, t) ;
808
+ ret fld. fold_expr_port( env_, e. span, t2) ;
771
809
}
772
810
773
811
case ( ast. expr_chan( ?x, ?t) ) {
774
812
auto ee = fold_expr( env_, fld, x) ;
775
- ret fld. fold_expr_chan( env_, e. span, ee, t) ;
813
+ auto t2 = fld. fold_ann( env_, t) ;
814
+ ret fld. fold_expr_chan( env_, e. span, ee, t2) ;
776
815
}
777
816
}
778
817
@@ -1475,6 +1514,12 @@ fn identity_fold_view_item_export[ENV](&ENV e, &span sp, ident i)
1475
1514
ret @respan( sp, ast. view_item_export( i) ) ;
1476
1515
}
1477
1516
1517
+ // Annotation folding.
1518
+
1519
+ fn identity_fold_ann[ ENV ] ( & ENV e, ann a) -> ann {
1520
+ ret a;
1521
+ }
1522
+
1478
1523
// Additional identities.
1479
1524
1480
1525
fn identity_fold_block[ ENV ] ( & ENV e, & span sp, & ast. block_ blk) -> block {
@@ -1668,6 +1713,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
1668
1713
fold_view_item_export =
1669
1714
bind identity_fold_view_item_export[ ENV ] ( _, _, _) ,
1670
1715
1716
+ fold_ann = bind identity_fold_ann[ ENV ] ( _, _) ,
1717
+
1671
1718
fold_block = bind identity_fold_block[ ENV ] ( _, _, _) ,
1672
1719
fold_fn = bind identity_fold_fn[ ENV ] ( _, _, _, _) ,
1673
1720
fold_fn_decl = bind identity_fold_fn_decl[ ENV ] ( _, _, _, _) ,
0 commit comments