@@ -618,7 +618,7 @@ fn parse_field(p: parser, sep: token::token) -> ast::field {
618
618
ret spanned( lo, e. span . hi , { mutbl: m, ident: i, expr: e} ) ;
619
619
}
620
620
621
- fn mk_expr ( p : parser , lo : uint , hi : uint , node : ast:: expr_ ) -> @ast:: expr {
621
+ fn mk_expr ( p : parser , lo : uint , hi : uint , + node : ast:: expr_ ) -> @ast:: expr {
622
622
ret @{ id : p. get_id ( ) , node : node, span : mk_sp ( lo, hi) } ;
623
623
}
624
624
@@ -1501,7 +1501,7 @@ fn parse_instance_var(p:parser, pr: ast::privacy) -> @ast::class_member {
1501
1501
span : mk_sp ( lo, p. last_span . hi ) } ;
1502
1502
}
1503
1503
1504
- fn parse_stmt ( p : parser , first_item_attrs : [ ast:: attribute ] ) -> @ast:: stmt {
1504
+ fn parse_stmt ( p : parser , + first_item_attrs : [ ast:: attribute ] ) -> @ast:: stmt {
1505
1505
fn check_expected_item ( p : parser , current_attrs : [ ast:: attribute ] ) {
1506
1506
// If we have attributes then we should have an item
1507
1507
if vec:: is_not_empty ( current_attrs) {
@@ -1603,7 +1603,7 @@ fn parse_block_tail(p: parser, lo: uint, s: ast::blk_check_mode) -> ast::blk {
1603
1603
}
1604
1604
1605
1605
fn parse_block_tail_ ( p : parser , lo : uint , s : ast:: blk_check_mode ,
1606
- first_item_attrs : [ ast:: attribute ] ) -> ast:: blk {
1606
+ + first_item_attrs : [ ast:: attribute ] ) -> ast:: blk {
1607
1607
let mut stmts = [ ] ;
1608
1608
let mut expr = none;
1609
1609
let view_items = maybe_parse_view_import_only ( p, first_item_attrs) ;
@@ -1788,24 +1788,22 @@ fn parse_fn_header(p: parser) -> {ident: ast::ident, tps: [ast::ty_param]} {
1788
1788
ret { ident : id, tps : ty_params} ;
1789
1789
}
1790
1790
1791
- fn mk_item ( p : parser , lo : uint , hi : uint , ident : ast:: ident , node : ast :: item_ ,
1792
- attrs : [ ast:: attribute ] ) -> @ast:: item {
1791
+ fn mk_item ( p : parser , lo : uint , hi : uint , + ident : ast:: ident ,
1792
+ + node : ast :: item_ , + attrs : [ ast:: attribute ] ) -> @ast:: item {
1793
1793
ret @{ ident : ident,
1794
1794
attrs : attrs,
1795
1795
id : p. get_id ( ) ,
1796
1796
node : node,
1797
1797
span : mk_sp ( lo, hi) } ;
1798
1798
}
1799
1799
1800
- fn parse_item_fn ( p : parser , purity : ast:: purity ,
1801
- attrs : [ ast :: attribute ] ) -> @ast :: item {
1802
- let lo = p . last_span . lo ;
1800
+ type item_info = ( ast :: ident , ast :: item_ , option < [ ast:: attribute ] > ) ;
1801
+
1802
+ fn parse_item_fn ( p : parser , purity : ast :: purity ) -> item_info {
1803
1803
let t = parse_fn_header ( p) ;
1804
1804
let ( decl, _) = parse_fn_decl ( p, purity, parse_arg) ;
1805
1805
let ( inner_attrs, body) = parse_inner_attrs_and_block ( p, true ) ;
1806
- let attrs = attrs + inner_attrs;
1807
- ret mk_item( p, lo, body. span . hi , t. ident ,
1808
- ast:: item_fn ( decl, t. tps , body) , attrs) ;
1806
+ ( t. ident , ast:: item_fn ( decl, t. tps , body) , some ( inner_attrs) )
1809
1807
}
1810
1808
1811
1809
fn parse_method_name ( p : parser ) -> ast:: ident {
@@ -1834,21 +1832,19 @@ fn parse_method(p: parser, pr: ast::privacy) -> @ast::method {
1834
1832
self_id: p. get_id ( ) , privacy: pr}
1835
1833
}
1836
1834
1837
- fn parse_item_iface ( p : parser , attrs : [ ast :: attribute ] ) -> @ast :: item {
1838
- let lo = p . last_span . lo , ident = parse_ident ( p) ;
1835
+ fn parse_item_iface ( p : parser ) -> item_info {
1836
+ let ident = parse_ident ( p) ;
1839
1837
let rp = parse_region_param ( p) ;
1840
1838
let tps = parse_ty_params ( p) ;
1841
1839
let meths = parse_ty_methods ( p) ;
1842
- ret mk_item( p, lo, p. last_span . hi , ident,
1843
- ast:: item_iface ( tps, rp, meths) , attrs) ;
1840
+ ( ident, ast:: item_iface ( tps, rp, meths) , none)
1844
1841
}
1845
1842
1846
1843
// Parses three variants (with the region/type params always optional):
1847
1844
// impl /&<T: copy> of to_str for [T] { ... }
1848
1845
// impl name/&<T> of to_str for [T] { ... }
1849
1846
// impl name/&<T> for [T] { ... }
1850
- fn parse_item_impl ( p : parser , attrs : [ ast:: attribute ] ) -> @ast:: item {
1851
- let lo = p. last_span . lo ;
1847
+ fn parse_item_impl ( p : parser ) -> item_info {
1852
1848
fn wrap_path ( p : parser , pt : @ast:: path ) -> @ast:: ty {
1853
1849
@{ id: p. get_id ( ) , node: ast:: ty_path ( pt, p. get_id ( ) ) , span: pt. span }
1854
1850
}
@@ -1882,12 +1878,10 @@ fn parse_item_impl(p: parser, attrs: [ast::attribute]) -> @ast::item {
1882
1878
let mut meths = [ ] ;
1883
1879
expect ( p, token:: LBRACE ) ;
1884
1880
while !eat ( p, token:: RBRACE ) { meths += [ parse_method ( p, ast:: pub) ] ; }
1885
- ret mk_item( p, lo, p. last_span . hi , ident,
1886
- ast:: item_impl ( tps, rp, ifce, ty, meths) , attrs) ;
1881
+ ( ident, ast:: item_impl ( tps, rp, ifce, ty, meths) , none)
1887
1882
}
1888
1883
1889
- fn parse_item_res ( p : parser , attrs : [ ast:: attribute ] ) -> @ast:: item {
1890
- let lo = p. last_span . lo ;
1884
+ fn parse_item_res ( p : parser ) -> item_info {
1891
1885
let ident = parse_value_ident ( p) ;
1892
1886
let rp = parse_region_param ( p) ;
1893
1887
let ty_params = parse_ty_params ( p) ;
@@ -1897,20 +1891,17 @@ fn parse_item_res(p: parser, attrs: [ast::attribute]) -> @ast::item {
1897
1891
let t = parse_ty ( p, false ) ;
1898
1892
expect ( p, token:: RPAREN ) ;
1899
1893
let dtor = parse_block_no_value ( p) ;
1900
- let decl =
1901
- { inputs:
1902
- [ { mode: ast:: expl ( ast:: by_ref) , ty: t,
1903
- ident: arg_ident, id: p. get_id ( ) } ] ,
1904
- output: @{ id: p. get_id ( ) ,
1905
- node: ast:: ty_nil,
1906
- span: mk_sp ( lo, lo) } ,
1907
- purity: ast:: impure_fn,
1908
- cf: ast:: return_val,
1909
- constraints: [ ] } ;
1910
- ret mk_item( p, lo, dtor. span . hi , ident,
1911
- ast:: item_res ( decl, ty_params, dtor,
1912
- p. get_id ( ) , p. get_id ( ) , rp) ,
1913
- attrs) ;
1894
+ let decl = {
1895
+ inputs: [ { mode: ast:: expl ( ast:: by_ref) , ty: t,
1896
+ ident: arg_ident, id: p. get_id ( ) } ] ,
1897
+ output: @{ id: p. get_id ( ) , node: ast:: ty_nil,
1898
+ span: ast_util:: dummy_sp ( ) } ,
1899
+ purity: ast:: impure_fn,
1900
+ cf: ast:: return_val,
1901
+ constraints: [ ]
1902
+ } ;
1903
+ ( ident, ast:: item_res ( decl, ty_params, dtor,
1904
+ p. get_id ( ) , p. get_id ( ) , rp) , none)
1914
1905
}
1915
1906
1916
1907
// Instantiates ident <i> with references to <typarams> as arguments. Used to
@@ -1946,8 +1937,7 @@ fn parse_iface_ref_list(p:parser) -> [@ast::iface_ref] {
1946
1937
parse_iface_ref, p)
1947
1938
}
1948
1939
1949
- fn parse_item_class ( p : parser , attrs : [ ast:: attribute ] ) -> @ast:: item {
1950
- let lo = p. last_span . lo ;
1940
+ fn parse_item_class ( p : parser ) -> item_info {
1951
1941
let class_name = parse_value_ident ( p) ;
1952
1942
let rp = parse_region_param ( p) ;
1953
1943
let ty_params = parse_ty_params ( p) ;
@@ -1970,13 +1960,15 @@ fn parse_item_class(p: parser, attrs: [ast::attribute]) -> @ast::item {
1970
1960
p. bump ( ) ;
1971
1961
alt the_ctor {
1972
1962
some( ( ct_d, ct_b, ct_s) ) {
1973
- ret mk_item ( p, lo, p. last_span . hi , class_name,
1974
- ast:: item_class ( ty_params, ifaces, ms,
1975
- { node : { id : ctor_id,
1976
- self_id : p. get_id ( ) ,
1977
- dec : ct_d,
1978
- body : ct_b} ,
1979
- span: ct_s} , rp) , attrs) ; }
1963
+ ( class_name,
1964
+ ast:: item_class ( ty_params, ifaces, ms, {
1965
+ node : { id : ctor_id,
1966
+ self_id : p. get_id ( ) ,
1967
+ dec : ct_d,
1968
+ body : ct_b} ,
1969
+ span: ct_s} , rp) ,
1970
+ none)
1971
+ }
1980
1972
/*
1981
1973
Is it strange for the parser to check this?
1982
1974
*/
@@ -2034,13 +2026,14 @@ fn parse_class_item(p:parser, class_name_with_tps: @ast::path)
2034
2026
}
2035
2027
2036
2028
fn parse_mod_items ( p : parser , term : token:: token ,
2037
- first_item_attrs : [ ast:: attribute ] ) -> ast:: _mod {
2029
+ + first_item_attrs : [ ast:: attribute ] ) -> ast:: _mod {
2038
2030
// Shouldn't be any view items since we've already parsed an item attr
2039
2031
let view_items = maybe_parse_view ( p, first_item_attrs) ;
2040
2032
let mut items: [ @ast:: item ] = [ ] ;
2041
- let mut initial_attrs = first_item_attrs ;
2033
+ let mut first = true ;
2042
2034
while p. token != term {
2043
- let attrs = initial_attrs + parse_outer_attributes ( p) ;
2035
+ let mut attrs = parse_outer_attributes ( p) ;
2036
+ if first { attrs = first_item_attrs + attrs; first = false ; }
2044
2037
#debug[ "parse_mod_items: parse_item(attrs=%?)" , attrs] ;
2045
2038
alt parse_item( p, attrs) {
2046
2039
some ( i) { items += [ i] ; }
@@ -2050,42 +2043,36 @@ fn parse_mod_items(p: parser, term: token::token,
2050
2043
}
2051
2044
}
2052
2045
#debug[ "parse_mod_items: attrs=%?" , attrs] ;
2053
- initial_attrs = [ ] ;
2054
2046
}
2055
2047
2056
- if vec :: is_not_empty ( initial_attrs ) {
2048
+ if first && first_item_attrs . len ( ) > 0 u {
2057
2049
// We parsed attributes for the first item but didn't find the item
2058
2050
p. fatal ( "expected item" ) ;
2059
2051
}
2060
2052
2061
2053
ret { view_items : view_items, items : items} ;
2062
2054
}
2063
2055
2064
- fn parse_item_const ( p : parser , attrs : [ ast:: attribute ] ) -> @ast:: item {
2065
- let lo = p. last_span . lo ;
2056
+ fn parse_item_const ( p : parser ) -> item_info {
2066
2057
let id = parse_value_ident ( p) ;
2067
2058
expect ( p, token:: COLON ) ;
2068
2059
let ty = parse_ty ( p, false ) ;
2069
2060
expect ( p, token:: EQ ) ;
2070
2061
let e = parse_expr ( p) ;
2071
- let mut hi = p. span . hi ;
2072
2062
expect ( p, token:: SEMI ) ;
2073
- ret mk_item ( p , lo , hi , id, ast:: item_const ( ty, e) , attrs ) ;
2063
+ ( id, ast:: item_const ( ty, e) , none )
2074
2064
}
2075
2065
2076
- fn parse_item_mod ( p : parser , attrs : [ ast:: attribute ] ) -> @ast:: item {
2077
- let lo = p. last_span . lo ;
2066
+ fn parse_item_mod ( p : parser ) -> item_info {
2078
2067
let id = parse_ident ( p) ;
2079
2068
expect ( p, token:: LBRACE ) ;
2080
2069
let inner_attrs = parse_inner_attrs_and_next ( p) ;
2081
- let first_item_outer_attrs = inner_attrs. next ;
2082
- let m = parse_mod_items ( p, token:: RBRACE , first_item_outer_attrs) ;
2083
- let mut hi = p. span . hi ;
2070
+ let m = parse_mod_items ( p, token:: RBRACE , inner_attrs. next ) ;
2084
2071
expect ( p, token:: RBRACE ) ;
2085
- ret mk_item ( p , lo , hi , id, ast:: item_mod ( m) , attrs + inner_attrs. inner ) ;
2072
+ ( id, ast:: item_mod ( m) , some ( inner_attrs. inner ) )
2086
2073
}
2087
2074
2088
- fn parse_item_native_fn ( p : parser , attrs : [ ast:: attribute ] ,
2075
+ fn parse_item_native_fn ( p : parser , + attrs : [ ast:: attribute ] ,
2089
2076
purity : ast:: purity ) -> @ast:: native_item {
2090
2077
let lo = p. last_span . lo ;
2091
2078
let t = parse_fn_header ( p) ;
@@ -2109,12 +2096,12 @@ fn parse_fn_purity(p: parser) -> ast::purity {
2109
2096
else { unexpected ( p) ; }
2110
2097
}
2111
2098
2112
- fn parse_native_item ( p : parser , attrs : [ ast:: attribute ] ) ->
2099
+ fn parse_native_item ( p : parser , + attrs : [ ast:: attribute ] ) ->
2113
2100
@ast:: native_item {
2114
2101
parse_item_native_fn ( p, attrs, parse_fn_purity ( p) )
2115
2102
}
2116
2103
2117
- fn parse_native_mod_items ( p : parser , first_item_attrs : [ ast:: attribute ] ) ->
2104
+ fn parse_native_mod_items ( p : parser , + first_item_attrs : [ ast:: attribute ] ) ->
2118
2105
ast:: native_mod {
2119
2106
// Shouldn't be any view items since we've already parsed an item attr
2120
2107
let view_items =
@@ -2132,18 +2119,14 @@ fn parse_native_mod_items(p: parser, first_item_attrs: [ast::attribute]) ->
2132
2119
items : items} ;
2133
2120
}
2134
2121
2135
- fn parse_item_native_mod ( p : parser , attrs : [ ast:: attribute ] ) -> @ast:: item {
2136
- let lo = p. last_span . lo ;
2122
+ fn parse_item_native_mod ( p : parser ) -> item_info {
2137
2123
expect_keyword ( p, "mod" ) ;
2138
2124
let id = parse_ident ( p) ;
2139
2125
expect ( p, token:: LBRACE ) ;
2140
2126
let more_attrs = parse_inner_attrs_and_next ( p) ;
2141
- let inner_attrs = more_attrs. inner ;
2142
- let first_item_outer_attrs = more_attrs. next ;
2143
- let m = parse_native_mod_items ( p, first_item_outer_attrs) ;
2144
- let mut hi = p. span . hi ;
2127
+ let m = parse_native_mod_items ( p, more_attrs. next ) ;
2145
2128
expect ( p, token:: RBRACE ) ;
2146
- ret mk_item ( p , lo , hi , id, ast:: item_native_mod ( m) , attrs + inner_attrs ) ;
2129
+ ( id, ast:: item_native_mod ( m) , some ( more_attrs . inner ) )
2147
2130
}
2148
2131
2149
2132
fn parse_type_decl ( p : parser ) -> { lo : uint , ident: ast:: ident } {
@@ -2152,15 +2135,14 @@ fn parse_type_decl(p: parser) -> {lo: uint, ident: ast::ident} {
2152
2135
ret { lo : lo, ident : id} ;
2153
2136
}
2154
2137
2155
- fn parse_item_type ( p : parser , attrs : [ ast :: attribute ] ) -> @ast :: item {
2138
+ fn parse_item_type ( p : parser ) -> item_info {
2156
2139
let t = parse_type_decl ( p) ;
2157
2140
let rp = parse_region_param ( p) ;
2158
2141
let tps = parse_ty_params ( p) ;
2159
2142
expect ( p, token:: EQ ) ;
2160
2143
let ty = parse_ty ( p, false ) ;
2161
- let mut hi = p. span . hi ;
2162
2144
expect ( p, token:: SEMI ) ;
2163
- ret mk_item ( p , t . lo , hi , t . ident , ast:: item_ty ( ty, tps, rp) , attrs ) ;
2145
+ ( t . ident , ast:: item_ty ( ty, tps, rp) , none )
2164
2146
}
2165
2147
2166
2148
fn parse_region_param ( p : parser ) -> ast:: region_param {
@@ -2172,8 +2154,7 @@ fn parse_region_param(p: parser) -> ast::region_param {
2172
2154
}
2173
2155
}
2174
2156
2175
- fn parse_item_enum ( p : parser , attrs : [ ast:: attribute ] ) -> @ast:: item {
2176
- let lo = p. last_span . lo ;
2157
+ fn parse_item_enum ( p : parser ) -> item_info {
2177
2158
let id = parse_ident ( p) ;
2178
2159
let rp = parse_region_param ( p) ;
2179
2160
let ty_params = parse_ty_params ( p) ;
@@ -2191,8 +2172,7 @@ fn parse_item_enum(p: parser, attrs: [ast::attribute]) -> @ast::item {
2191
2172
args: [ { ty: ty, id: p. get_id ( ) } ] ,
2192
2173
id: p. get_id ( ) ,
2193
2174
disr_expr: none} ) ;
2194
- ret mk_item( p, lo, ty. span . hi , id,
2195
- ast:: item_enum ( [ variant] , ty_params, rp) , attrs) ;
2175
+ ret ( id, ast:: item_enum ( [ variant] , ty_params, rp) , none) ;
2196
2176
}
2197
2177
expect ( p, token:: LBRACE ) ;
2198
2178
@@ -2227,8 +2207,7 @@ fn parse_item_enum(p: parser, attrs: [ast::attribute]) -> @ast::item {
2227
2207
if ( have_disr && !all_nullary) {
2228
2208
p. fatal ( "discriminator values can only be used with a c-like enum" ) ;
2229
2209
}
2230
- ret mk_item( p, lo, p. last_span . hi , id,
2231
- ast:: item_enum ( variants, ty_params, rp) , attrs) ;
2210
+ ( id, ast:: item_enum ( variants, ty_params, rp) , none)
2232
2211
}
2233
2212
2234
2213
fn parse_fn_ty_proto ( p : parser ) -> ast:: proto {
@@ -2262,40 +2241,44 @@ fn fn_expr_lookahead(tok: token::token) -> bool {
2262
2241
}
2263
2242
}
2264
2243
2265
- fn parse_item ( p : parser , attrs : [ ast:: attribute ] ) -> option < @ast:: item > {
2266
- if eat_keyword ( p, "const" ) {
2267
- ret some ( parse_item_const ( p, attrs) ) ;
2244
+ fn parse_item ( p : parser , +attrs : [ ast:: attribute ] ) -> option < @ast:: item > {
2245
+ let lo = p. span . lo ;
2246
+ let ( ident, item_, extra_attrs) = if eat_keyword ( p, "const" ) {
2247
+ parse_item_const ( p)
2268
2248
} else if is_keyword ( p, "fn" ) && !fn_expr_lookahead ( p. look_ahead ( 1 u) ) {
2269
2249
p. bump ( ) ;
2270
- ret some ( parse_item_fn ( p, ast:: impure_fn, attrs ) ) ;
2250
+ parse_item_fn ( p, ast:: impure_fn)
2271
2251
} else if eat_keyword ( p, "pure" ) {
2272
2252
expect_keyword ( p, "fn" ) ;
2273
- ret some ( parse_item_fn ( p, ast:: pure_fn, attrs ) ) ;
2253
+ parse_item_fn ( p, ast:: pure_fn)
2274
2254
} else if is_keyword ( p, "unsafe" ) && p. look_ahead ( 1 u) != token:: LBRACE {
2275
2255
p. bump ( ) ;
2276
2256
expect_keyword ( p, "fn" ) ;
2277
- ret some ( parse_item_fn ( p, ast:: unsafe_fn, attrs ) ) ;
2257
+ parse_item_fn ( p, ast:: unsafe_fn)
2278
2258
} else if eat_keyword ( p, "crust" ) {
2279
2259
expect_keyword ( p, "fn" ) ;
2280
- ret some ( parse_item_fn ( p, ast:: crust_fn, attrs ) ) ;
2260
+ parse_item_fn ( p, ast:: crust_fn)
2281
2261
} else if eat_keyword ( p, "mod" ) {
2282
- ret some ( parse_item_mod ( p, attrs ) ) ;
2262
+ parse_item_mod ( p)
2283
2263
} else if eat_keyword ( p, "native" ) {
2284
- ret some ( parse_item_native_mod ( p, attrs ) ) ;
2285
- } if eat_keyword ( p, "type" ) {
2286
- ret some ( parse_item_type ( p, attrs ) ) ;
2264
+ parse_item_native_mod ( p)
2265
+ } else if eat_keyword ( p, "type" ) {
2266
+ parse_item_type ( p)
2287
2267
} else if eat_keyword ( p, "enum" ) {
2288
- ret some ( parse_item_enum ( p, attrs ) ) ;
2268
+ parse_item_enum ( p)
2289
2269
} else if eat_keyword ( p, "iface" ) {
2290
- ret some ( parse_item_iface ( p, attrs ) ) ;
2270
+ parse_item_iface ( p)
2291
2271
} else if eat_keyword ( p, "impl" ) {
2292
- ret some ( parse_item_impl ( p, attrs ) ) ;
2272
+ parse_item_impl ( p)
2293
2273
} else if eat_keyword ( p, "resource" ) {
2294
- ret some ( parse_item_res ( p, attrs ) ) ;
2274
+ parse_item_res ( p)
2295
2275
} else if eat_keyword ( p, "class" ) {
2296
- ret some ( parse_item_class ( p, attrs) ) ;
2297
- }
2298
- else { ret none; }
2276
+ parse_item_class ( p)
2277
+ } else { ret none; } ;
2278
+ some ( mk_item ( p, lo, p. last_span . hi , ident, item_, alt extra_attrs {
2279
+ some( as) { attrs + as }
2280
+ none { attrs }
2281
+ } ) )
2299
2282
}
2300
2283
2301
2284
fn parse_use ( p : parser ) -> ast:: view_item_ {
0 commit comments