@@ -1606,8 +1606,8 @@ fn parse_block_tail_(p: parser, lo: uint, s: blk_check_mode,
1606
1606
+first_item_attrs : [ attribute ] ) -> blk {
1607
1607
let mut stmts = [ ] ;
1608
1608
let mut expr = none;
1609
- let view_items = maybe_parse_view_import_only ( p, first_item_attrs) ;
1610
- let mut initial_attrs = first_item_attrs ;
1609
+ let { attrs_remaining , view_items} = parse_view ( p, first_item_attrs, true ) ;
1610
+ let mut initial_attrs = attrs_remaining ;
1611
1611
1612
1612
if p. token == token:: RBRACE && !vec:: is_empty ( initial_attrs) {
1613
1613
p. fatal ( "expected item" ) ;
@@ -2036,12 +2036,13 @@ fn parse_visibility(p: parser, def: visibility) -> visibility {
2036
2036
fn parse_mod_items ( p : parser , term : token:: token ,
2037
2037
+first_item_attrs : [ attribute ] ) -> _mod {
2038
2038
// Shouldn't be any view items since we've already parsed an item attr
2039
- let view_items = maybe_parse_view ( p, first_item_attrs) ;
2039
+ let { attrs_remaining, view_items} =
2040
+ parse_view ( p, first_item_attrs, false ) ;
2040
2041
let mut items: [ @item] = [ ] ;
2041
2042
let mut first = true ;
2042
2043
while p. token != term {
2043
2044
let mut attrs = parse_outer_attributes ( p) ;
2044
- if first { attrs = first_item_attrs + attrs; first = false ; }
2045
+ if first { attrs = attrs_remaining + attrs; first = false ; }
2045
2046
#debug[ "parse_mod_items: parse_item(attrs=%?)" , attrs] ;
2046
2047
let vis = parse_visibility ( p, private) ;
2047
2048
alt parse_item( p, attrs, vis) {
@@ -2054,7 +2055,7 @@ fn parse_mod_items(p: parser, term: token::token,
2054
2055
#debug[ "parse_mod_items: attrs=%?" , attrs] ;
2055
2056
}
2056
2057
2057
- if first && first_item_attrs . len ( ) > 0 u {
2058
+ if first && attrs_remaining . len ( ) > 0 u {
2058
2059
// We parsed attributes for the first item but didn't find the item
2059
2060
p. fatal ( "expected item" ) ;
2060
2061
}
@@ -2113,12 +2114,10 @@ fn parse_native_item(p: parser, +attrs: [attribute]) ->
2113
2114
fn parse_native_mod_items ( p : parser , +first_item_attrs : [ attribute ] ) ->
2114
2115
native_mod {
2115
2116
// Shouldn't be any view items since we've already parsed an item attr
2116
- let view_items =
2117
- if vec:: len ( first_item_attrs) == 0 u {
2118
- parse_native_view ( p)
2119
- } else { [ ] } ;
2117
+ let { attrs_remaining, view_items} =
2118
+ parse_view ( p, first_item_attrs, false ) ;
2120
2119
let mut items: [ @native_item ] = [ ] ;
2121
- let mut initial_attrs = first_item_attrs ;
2120
+ let mut initial_attrs = attrs_remaining ;
2122
2121
while p. token != token:: RBRACE {
2123
2122
let attrs = initial_attrs + parse_outer_attributes ( p) ;
2124
2123
initial_attrs = [ ] ;
@@ -2378,58 +2377,38 @@ fn parse_view_paths(p: parser) -> [@view_path] {
2378
2377
ret vp;
2379
2378
}
2380
2379
2381
- fn parse_view_item ( p : parser ) -> @view_item {
2382
- let lo = p. span . lo ;
2383
- let the_item =
2384
- if eat_keyword ( p, "use" ) {
2385
- parse_use ( p)
2386
- } else if eat_keyword ( p, "import" ) {
2387
- view_item_import ( parse_view_paths ( p) )
2388
- } else if eat_keyword ( p, "export" ) {
2389
- view_item_export ( parse_view_paths ( p) )
2390
- } else {
2391
- fail
2392
- } ;
2393
- let mut hi = p. span . lo ;
2394
- expect ( p, token:: SEMI ) ;
2395
- ret @spanned ( lo, hi, the_item) ;
2396
- }
2397
-
2398
2380
fn is_view_item ( p : parser ) -> bool {
2399
- is_keyword ( p, "use" ) || is_keyword ( p, "import" ) || is_keyword ( p, "export" )
2400
- }
2401
-
2402
- fn maybe_parse_view (
2403
- p : parser ,
2404
- first_item_attrs : [ attribute ] ) -> [ @view_item ] {
2405
-
2406
- maybe_parse_view_while ( p, first_item_attrs, is_view_item)
2407
- }
2408
-
2409
- fn maybe_parse_view_import_only (
2410
- p : parser ,
2411
- first_item_attrs : [ attribute ] ) -> [ @view_item ] {
2412
-
2413
- maybe_parse_view_while ( p, first_item_attrs, bind is_keyword ( _, "import" ) )
2381
+ let tok = if !is_keyword ( p, "pub" ) && !is_keyword ( p, "priv" ) { p. token }
2382
+ else { p. look_ahead ( 1 u) } ;
2383
+ token_is_keyword ( p, "use" , tok) || token_is_keyword ( p, "import" , tok) ||
2384
+ token_is_keyword ( p, "export" , tok)
2385
+ }
2386
+
2387
+ fn parse_view_item ( p : parser , +attrs : [ attribute ] ) -> @view_item {
2388
+ let lo = p. span . lo , vis = parse_visibility ( p, private) ;
2389
+ let node = if eat_keyword ( p, "use" ) {
2390
+ parse_use ( p)
2391
+ } else if eat_keyword ( p, "import" ) {
2392
+ view_item_import ( parse_view_paths ( p) )
2393
+ } else if eat_keyword ( p, "export" ) {
2394
+ view_item_export ( parse_view_paths ( p) )
2395
+ } else { fail; } ;
2396
+ expect ( p, token:: SEMI ) ;
2397
+ @{ node: node, attrs: attrs,
2398
+ vis: vis, span: mk_sp ( lo, p. last_span . hi ) }
2414
2399
}
2415
2400
2416
- fn maybe_parse_view_while (
2417
- p : parser ,
2418
- first_item_attrs : [ attribute ] ,
2419
- f : fn @( parser ) -> bool ) -> [ @view_item ] {
2420
-
2421
- if vec:: len ( first_item_attrs) == 0 u {
2422
- let mut items = [ ] ;
2423
- while f ( p) { items += [ parse_view_item ( p) ] ; }
2424
- ret items;
2425
- } else {
2426
- // Shouldn't be any view items since we've already parsed an item attr
2427
- ret [ ] ;
2401
+ fn parse_view ( p : parser , +first_item_attrs : [ attribute ] ,
2402
+ only_imports : bool ) -> { attrs_remaining : [ attribute ] ,
2403
+ view_items : [ @view_item ] } {
2404
+ let mut attrs = first_item_attrs + parse_outer_attributes ( p) ;
2405
+ let mut items = [ ] ;
2406
+ while if only_imports { is_keyword ( p, "import" ) }
2407
+ else { is_view_item ( p) } {
2408
+ items += [ parse_view_item ( p, attrs) ] ;
2409
+ attrs = parse_outer_attributes ( p) ;
2428
2410
}
2429
- }
2430
-
2431
- fn parse_native_view ( p : parser ) -> [ @view_item ] {
2432
- maybe_parse_view_while ( p, [ ] , is_view_item)
2411
+ { attrs_remaining: attrs, view_items: items}
2433
2412
}
2434
2413
2435
2414
// Parses a source module as a crate
@@ -2494,7 +2473,7 @@ fn parse_crate_directive(p: parser, first_outer_attr: [attribute]) ->
2494
2473
_ { unexpected( p) ; }
2495
2474
}
2496
2475
} else if is_view_item ( p) {
2497
- let vi = parse_view_item ( p) ;
2476
+ let vi = parse_view_item ( p, outer_attrs ) ;
2498
2477
ret spanned( lo, vi. span . hi , cdir_view_item ( vi) ) ;
2499
2478
} else { ret p. fatal ( "expected crate directive" ) ; }
2500
2479
}
0 commit comments