@@ -2,9 +2,11 @@ import std._io;
2
2
import std. util . option ;
3
3
import std. util . some ;
4
4
import std. util . none ;
5
+ import std. map . hashmap ;
5
6
6
7
import driver. session ;
7
8
import util. common ;
9
+ import util. common . append ;
8
10
import util. common . span ;
9
11
import util. common . new_str_hash ;
10
12
@@ -610,13 +612,38 @@ io fn parse_let(parser p) -> @ast.decl {
610
612
611
613
expect ( p, token. LET ) ;
612
614
auto ty = parse_ty ( p) ;
613
- auto id = parse_ident ( p) ;
615
+ auto ident = parse_ident ( p) ;
614
616
auto init = parse_initializer ( p) ;
615
617
616
618
auto hi = p. get_span ( ) ;
617
619
expect ( p, token. SEMI ) ;
618
620
619
- ret @spanned ( lo, hi, ast. decl_local ( id, some ( ty) , init) ) ;
621
+ let ast. local local = rec ( ty = some ( ty) ,
622
+ infer = false ,
623
+ ident = ident,
624
+ init = init,
625
+ id = p. next_def_id ( ) ) ;
626
+
627
+ ret @spanned ( lo, hi, ast. decl_local ( local) ) ;
628
+ }
629
+
630
+ io fn parse_auto ( parser p) -> @ast. decl {
631
+ auto lo = p. get_span ( ) ;
632
+
633
+ expect ( p, token. AUTO ) ;
634
+ auto ident = parse_ident ( p) ;
635
+ auto init = parse_initializer ( p) ;
636
+
637
+ auto hi = p. get_span ( ) ;
638
+ expect ( p, token. SEMI ) ;
639
+
640
+ let ast. local local = rec ( ty = none[ @ast. ty ] ,
641
+ infer = true ,
642
+ ident = ident,
643
+ init = init,
644
+ id = p. next_def_id ( ) ) ;
645
+
646
+ ret @spanned ( lo, hi, ast. decl_local ( local) ) ;
620
647
}
621
648
622
649
io fn parse_stmt ( parser p) -> @ast . stmt {
@@ -632,20 +659,15 @@ io fn parse_stmt(parser p) -> @ast.stmt {
632
659
}
633
660
634
661
case ( token. LET ) {
635
- auto leht = parse_let ( p) ;
662
+ auto decl = parse_let ( p) ;
636
663
auto hi = p. get_span ( ) ;
637
- ret @spanned ( lo, hi, ast. stmt_decl ( leht ) ) ;
664
+ ret @spanned ( lo, hi, ast. stmt_decl ( decl ) ) ;
638
665
}
639
666
640
667
case ( token. AUTO ) {
641
- p. bump ( ) ;
642
- auto id = parse_ident ( p) ;
643
- auto init = parse_initializer ( p) ;
668
+ auto decl = parse_auto ( p) ;
644
669
auto hi = p. get_span ( ) ;
645
- expect ( p, token. SEMI ) ;
646
-
647
- auto decl = ast. decl_local ( id, none[ @ast. ty ] , init) ;
648
- ret @spanned ( lo, hi, ast. stmt_decl ( @spanned ( lo, hi, decl) ) ) ;
670
+ ret @spanned ( lo, hi, ast. stmt_decl ( decl) ) ;
649
671
}
650
672
651
673
// Handle the (few) block-expr stmts first.
@@ -677,10 +699,41 @@ io fn parse_stmt(parser p) -> @ast.stmt {
677
699
io fn parse_block ( parser p) -> ast . block {
678
700
auto f = parse_stmt;
679
701
// FIXME: passing parse_stmt as an lval doesn't work at the moment.
680
- ret parse_seq[ @ast. stmt ] ( token. LBRACE ,
681
- token. RBRACE ,
682
- none[ token. token ] ,
683
- f, p) ;
702
+ auto stmts = parse_seq[ @ast. stmt ] ( token. LBRACE ,
703
+ token. RBRACE ,
704
+ none[ token. token ] ,
705
+ f, p) ;
706
+ auto index = new_str_hash[ uint] ( ) ;
707
+ auto u = 0 u;
708
+ for ( @ast. stmt s in stmts. node ) {
709
+ // FIXME: typestate bug requires we do this up top, not
710
+ // down below loop. Sigh.
711
+ u += 1 u;
712
+ alt ( s. node ) {
713
+ case ( ast. stmt_decl ( ?d) ) {
714
+ alt ( d. node ) {
715
+ case ( ast. decl_local ( ?loc) ) {
716
+ index. insert ( loc. ident , u-1 u) ;
717
+ }
718
+ case ( ast. decl_item ( ?it) ) {
719
+ alt ( it. node ) {
720
+ case ( ast. item_fn ( ?i, _, _) ) {
721
+ index. insert ( i, u-1 u) ;
722
+ }
723
+ case ( ast. item_mod ( ?i, _, _) ) {
724
+ index. insert ( i, u-1 u) ;
725
+ }
726
+ case ( ast. item_ty ( ?i, _, _) ) {
727
+ index. insert ( i, u-1 u) ;
728
+ }
729
+ }
730
+ }
731
+ }
732
+ }
733
+ }
734
+ }
735
+ let ast. block_ b = rec ( stmts=stmts. node , index=index) ;
736
+ ret spanned( stmts. span , stmts. span , b) ;
684
737
}
685
738
686
739
io fn parse_fn ( parser p) -> tup ( ast . ident, @ast . item) {
@@ -697,12 +750,12 @@ io fn parse_fn(parser p) -> tup(ast.ident, @ast.item) {
697
750
some ( token. COMMA ) ,
698
751
pf, p) ;
699
752
700
- let ast. ty output;
753
+ let @ ast. ty output;
701
754
if ( p. peek ( ) == token. RARROW ) {
702
755
p. bump ( ) ;
703
- output = * parse_ty ( p) ;
756
+ output = parse_ty ( p) ;
704
757
} else {
705
- output = spanned ( lo, inputs. span , ast. ty_nil ) ;
758
+ output = @ spanned ( lo, inputs. span , ast. ty_nil ) ;
706
759
}
707
760
708
761
auto body = parse_block ( p) ;
@@ -711,24 +764,33 @@ io fn parse_fn(parser p) -> tup(ast.ident, @ast.item) {
711
764
output = output,
712
765
body = body) ;
713
766
714
- let @ast. item i = @spanned ( lo, body. span ,
715
- ast. item_fn ( f, p. next_def_id ( ) ) ) ;
716
- ret tup( id, i) ;
767
+ auto item = ast. item_fn ( id, f, p. next_def_id ( ) ) ;
768
+ ret tup( id, @spanned ( lo, body. span , item) ) ;
717
769
}
718
770
771
+ io fn parse_mod_items ( parser p, token . token term) -> ast. _mod {
772
+ let vec[ @ast. item] items = vec ( ) ;
773
+ let hashmap[ ast. ident , uint] index = new_str_hash[ uint] ( ) ;
774
+ let uint u = 0 u;
775
+ while ( p. peek ( ) != term) {
776
+ auto pair = parse_item ( p) ;
777
+ append[ @ast. item ] ( items, pair. _1 ) ;
778
+ index. insert ( pair. _0 , u) ;
779
+ u += 1 u;
780
+ }
781
+ ret rec( items=items, index=index) ;
782
+ }
783
+
719
784
io fn parse_mod ( parser p) -> tup ( ast . ident, @ast . item) {
720
785
auto lo = p. get_span ( ) ;
721
786
expect ( p, token. MOD ) ;
722
787
auto id = parse_ident ( p) ;
723
788
expect ( p, token. LBRACE ) ;
724
- let ast. _mod m = new_str_hash[ @ast. item ] ( ) ;
725
- while ( p. peek ( ) != token. RBRACE ) {
726
- auto i = parse_item ( p) ;
727
- m. insert ( i. _0 , i. _1 ) ;
728
- }
789
+ auto m = parse_mod_items ( p, token. RBRACE ) ;
729
790
auto hi = p. get_span ( ) ;
730
791
expect ( p, token. RBRACE ) ;
731
- ret tup( id, @spanned ( lo, hi, ast. item_mod ( m, p. next_def_id ( ) ) ) ) ;
792
+ auto item = ast. item_mod ( id, m, p. next_def_id ( ) ) ;
793
+ ret tup( id, @spanned ( lo, hi, item) ) ;
732
794
}
733
795
734
796
io fn parse_item ( parser p) -> tup ( ast . ident, @ast . item) {
@@ -747,12 +809,7 @@ io fn parse_item(parser p) -> tup(ast.ident, @ast.item) {
747
809
io fn parse_crate ( parser p) -> @ast. crate {
748
810
auto lo = p. get_span ( ) ;
749
811
auto hi = lo;
750
- let ast. _mod m = new_str_hash[ @ast. item ] ( ) ;
751
- while ( p. peek ( ) != token. EOF ) {
752
- auto i = parse_item ( p) ;
753
- m. insert ( i. _0 , i. _1 ) ;
754
- hi = i. _1 . span ;
755
- }
812
+ auto m = parse_mod_items ( p, token. EOF ) ;
756
813
ret @spanned ( lo, hi, rec ( module=m) ) ;
757
814
}
758
815
0 commit comments