@@ -18,21 +18,29 @@ tag restriction {
18
18
RESTRICT_NO_CALL_EXPRS ;
19
19
}
20
20
21
+ tag file_type {
22
+ CRATE_FILE ;
23
+ SOURCE_FILE ;
24
+ }
25
+
21
26
state type parser =
22
27
state obj {
23
28
fn peek( ) -> token. token ;
24
29
impure fn bump ( ) ;
25
30
impure fn err ( str s) ;
26
31
impure fn restrict ( restriction r) ;
27
32
fn get_restriction ( ) -> restriction ;
33
+ fn get_file_type ( ) -> file_type ;
28
34
fn get_session ( ) -> session . session;
29
35
fn get_span ( ) -> common . span;
30
36
fn next_def_id ( ) -> ast. def_id ;
31
37
} ;
32
38
33
39
impure fn new_parser ( session. session sess,
34
- ast. crate_num crate, str path) -> parser {
40
+ ast. crate_num crate,
41
+ str path) -> parser {
35
42
state obj stdio_parser( session. session sess,
43
+ file_type ftype,
36
44
mutable token. token tok,
37
45
mutable common. pos lo,
38
46
mutable common. pos hi,
@@ -80,11 +88,20 @@ impure fn new_parser(session.session sess,
80
88
def += 1 ;
81
89
ret tup( crate , def) ;
82
90
}
91
+
92
+ fn get_file_type ( ) -> file_type {
93
+ ret ftype;
94
+ }
95
+
83
96
}
97
+ auto ftype = SOURCE_FILE ;
98
+ if ( _str. ends_with ( path, ".rc" ) ) {
99
+ ftype = CRATE_FILE ;
100
+ }
84
101
auto srdr = io. new_stdio_reader ( path) ;
85
102
auto rdr = lexer. new_reader ( srdr, path) ;
86
103
auto npos = rdr. get_curr_pos ( ) ;
87
- ret stdio_parser ( sess, lexer. next_token ( rdr) ,
104
+ ret stdio_parser ( sess, ftype , lexer. next_token ( rdr) ,
88
105
npos, npos, 0 , UNRESTRICTED , crate , rdr) ;
89
106
}
90
107
@@ -1310,6 +1327,20 @@ impure fn parse_auto(parser p) -> @ast.decl {
1310
1327
}
1311
1328
1312
1329
impure fn parse_stmt ( parser p) -> @ast . stmt {
1330
+ if ( p. get_file_type ( ) == SOURCE_FILE ) {
1331
+ ret parse_source_stmt ( p) ;
1332
+ } else {
1333
+ ret parse_crate_stmt ( p) ;
1334
+ }
1335
+ }
1336
+
1337
+ impure fn parse_crate_stmt ( parser p) -> @ast . stmt {
1338
+ auto cdir = parse_crate_directive ( p) ;
1339
+ ret @spanned ( cdir. span , cdir. span ,
1340
+ ast. stmt_crate_directive ( @cdir) ) ;
1341
+ }
1342
+
1343
+ impure fn parse_source_stmt ( parser p) -> @ast . stmt {
1313
1344
auto lo = p. get_span ( ) ;
1314
1345
alt ( p. peek ( ) ) {
1315
1346
@@ -1485,6 +1516,16 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
1485
1516
case ( ast. expr_check_expr ( _) ) { ret true ; }
1486
1517
}
1487
1518
}
1519
+ case ( ast. stmt_crate_directive ( ?cdir) ) {
1520
+ alt ( cdir. node ) {
1521
+ case ( ast. cdir_src_mod ( _, _) ) { ret true ; }
1522
+ case ( ast. cdir_view_item ( _) ) { ret true ; }
1523
+ case ( ast. cdir_meta ( _) ) { ret true ; }
1524
+ case ( ast. cdir_syntax ( _) ) { ret true ; }
1525
+ case ( ast. cdir_auth ( _, _) ) { ret true ; }
1526
+ case ( _) { ret false ; }
1527
+ }
1528
+ }
1488
1529
}
1489
1530
}
1490
1531
@@ -2182,6 +2223,21 @@ impure fn parse_crate_directive(parser p) -> ast.crate_directive
2182
2223
expect ( p, token. RBRACE ) ;
2183
2224
ret spanned( lo, hi, ast. cdir_let ( id, x, v) ) ;
2184
2225
}
2226
+
2227
+ case ( token. USE ) {
2228
+ auto vi = parse_use_or_import ( p) ;
2229
+ ret spanned( lo, vi. span , ast. cdir_view_item ( vi) ) ;
2230
+ }
2231
+
2232
+ case ( token. IMPORT ) {
2233
+ auto vi = parse_use_or_import ( p) ;
2234
+ ret spanned( lo, vi. span , ast. cdir_view_item ( vi) ) ;
2235
+ }
2236
+
2237
+ case ( _) {
2238
+ auto x = parse_expr ( p) ;
2239
+ ret spanned( lo, x. span , ast. cdir_expr ( x) ) ;
2240
+ }
2185
2241
}
2186
2242
fail;
2187
2243
}
0 commit comments