@@ -146,9 +146,10 @@ impure fn parse_ty_fn(parser p) -> ast.ty_ {
146
146
147
147
ret ast. ty_fn ( inputs. node , output) ;
148
148
}
149
-
149
+
150
150
impure fn parse_ty ( parser p) -> @ast . ty {
151
151
auto lo = p. get_span ( ) ;
152
+ auto hi = lo;
152
153
let ast. ty_ t;
153
154
alt ( p. peek ( ) ) {
154
155
case ( token. INT ) { p. bump ( ) ; t = ast. ty_int ; }
@@ -157,12 +158,29 @@ impure fn parse_ty(parser p) -> @ast.ty {
157
158
case ( token. CHAR ) { p. bump ( ) ; t = ast. ty_char ; }
158
159
case ( token. MACH ( ?tm) ) { p. bump ( ) ; t = ast. ty_machine ( tm) ; }
159
160
161
+ case ( token. LPAREN ) {
162
+ p. bump ( ) ;
163
+ alt ( p. peek ( ) ) {
164
+ case ( token. RPAREN ) {
165
+ hi = p. get_span ( ) ;
166
+ p. bump ( ) ;
167
+ t = ast. ty_nil ;
168
+ }
169
+ case ( _) {
170
+ t = parse_ty ( p) . node ;
171
+ hi = p. get_span ( ) ;
172
+ expect ( p, token. RPAREN ) ;
173
+ }
174
+ }
175
+ }
176
+
160
177
case ( token. AT ) { p. bump ( ) ; t = ast. ty_box ( parse_ty ( p) ) ; }
161
178
162
179
case ( token. VEC ) {
163
180
p. bump ( ) ;
164
181
expect ( p, token. LBRACKET ) ;
165
182
t = ast. ty_vec ( parse_ty ( p) ) ;
183
+ hi = p. get_span ( ) ;
166
184
expect ( p, token. RBRACKET ) ;
167
185
}
168
186
@@ -171,11 +189,39 @@ impure fn parse_ty(parser p) -> @ast.ty {
171
189
auto f = parse_possibly_mutable_ty; // FIXME: trans_const_lval bug
172
190
auto elems = parse_seq[ tup ( bool, @ast. ty ) ] ( token. LPAREN ,
173
191
token. RPAREN , some ( token. COMMA ) , f, p) ;
192
+ hi = p. get_span ( ) ;
174
193
t = ast. ty_tup ( elems. node ) ;
175
194
}
176
195
177
196
case ( token. FN ) {
178
197
t = parse_ty_fn ( p) ;
198
+ alt ( t) {
199
+ case ( ast. ty_fn ( _, ?out) ) {
200
+ hi = out. span ;
201
+ }
202
+ }
203
+ }
204
+
205
+ case ( token. IDENT ( _) ) {
206
+ let ast. path pth = vec ( ) ;
207
+ let bool more = true ;
208
+ while ( more) {
209
+ alt ( p. peek ( ) ) {
210
+ case ( token. IDENT ( ?i) ) {
211
+ auto n = parse_name ( p, i) ;
212
+ hi = n. span ;
213
+ if ( p. peek ( ) == token. DOT ) {
214
+ p. bump ( ) ;
215
+ } else {
216
+ more = false ;
217
+ }
218
+ }
219
+ case ( _) {
220
+ more = false ;
221
+ }
222
+ }
223
+ }
224
+ t = ast. ty_path ( pth, none[ ast. def ] ) ;
179
225
}
180
226
181
227
case ( _) {
@@ -184,7 +230,7 @@ impure fn parse_ty(parser p) -> @ast.ty {
184
230
fail;
185
231
}
186
232
}
187
- ret @spanned ( lo, lo , t) ;
233
+ ret @spanned ( lo, hi , t) ;
188
234
}
189
235
190
236
impure fn parse_arg ( parser p) -> ast . arg {
@@ -328,6 +374,15 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
328
374
329
375
case ( token. LPAREN ) {
330
376
p. bump ( ) ;
377
+ alt ( p. peek ( ) ) {
378
+ case ( token. RPAREN ) {
379
+ hi = p. get_span ( ) ;
380
+ p. bump ( ) ;
381
+ auto lit = @spanned ( lo, hi, ast. lit_nil ) ;
382
+ ret @spanned ( lo, hi,
383
+ ast. expr_lit ( lit, ast. ann_none ) ) ;
384
+ }
385
+ }
331
386
auto e = parse_expr ( p) ;
332
387
hi = p. get_span ( ) ;
333
388
expect ( p, token. RPAREN ) ;
@@ -409,6 +464,7 @@ impure fn parse_path_expr(parser p) -> @ast.expr {
409
464
}
410
465
411
466
case ( token. LPAREN ) {
467
+ p. bump ( ) ;
412
468
auto ix = parse_bottom_expr ( p) ;
413
469
hi = ix. span ;
414
470
auto e_ = ast. expr_index ( e, ix, ast. ann_none ) ;
@@ -889,7 +945,7 @@ impure fn parse_block(parser p) -> ast.block {
889
945
ret spanned( stmts. span , stmts. span , b) ;
890
946
}
891
947
892
- impure fn parse_fn ( parser p) -> tup ( ast . ident, @ast . item) {
948
+ impure fn parse_item_fn ( parser p) -> tup ( ast . ident, @ast . item) {
893
949
auto lo = p. get_span ( ) ;
894
950
expect ( p, token. FN ) ;
895
951
auto id = parse_ident ( p) ;
@@ -934,7 +990,7 @@ impure fn parse_mod_items(parser p, token.token term) -> ast._mod {
934
990
ret rec( items=items, index=index) ;
935
991
}
936
992
937
- impure fn parse_mod ( parser p) -> tup ( ast . ident, @ast . item) {
993
+ impure fn parse_item_mod ( parser p) -> tup ( ast . ident, @ast . item) {
938
994
auto lo = p. get_span ( ) ;
939
995
expect ( p, token. MOD ) ;
940
996
auto id = parse_ident ( p) ;
@@ -946,13 +1002,28 @@ impure fn parse_mod(parser p) -> tup(ast.ident, @ast.item) {
946
1002
ret tup( id, @spanned ( lo, hi, item) ) ;
947
1003
}
948
1004
1005
+ impure fn parse_item_type ( parser p) -> tup ( ast . ident, @ast . item) {
1006
+ auto lo = p. get_span ( ) ;
1007
+ expect ( p, token. TYPE ) ;
1008
+ auto id = parse_ident ( p) ;
1009
+ expect ( p, token. EQ ) ;
1010
+ auto ty = parse_ty ( p) ;
1011
+ auto hi = p. get_span ( ) ;
1012
+ expect ( p, token. SEMI ) ;
1013
+ auto item = ast. item_ty ( id, ty, p. next_def_id ( ) , ast. ann_none ) ;
1014
+ ret tup( id, @spanned ( lo, hi, item) ) ;
1015
+ }
1016
+
949
1017
impure fn parse_item ( parser p) -> tup ( ast . ident, @ast . item) {
950
1018
alt ( p. peek ( ) ) {
951
1019
case ( token. FN ) {
952
- ret parse_fn ( p) ;
1020
+ ret parse_item_fn ( p) ;
953
1021
}
954
1022
case ( token. MOD ) {
955
- ret parse_mod ( p) ;
1023
+ ret parse_item_mod ( p) ;
1024
+ }
1025
+ case ( token. TYPE ) {
1026
+ ret parse_item_type ( p) ;
956
1027
}
957
1028
}
958
1029
p. err ( "expectied item" ) ;
0 commit comments