@@ -1870,17 +1870,20 @@ fn parse_item_mod(&parser p, vec[ast::attribute] attrs) -> @ast::item {
1870
1870
ret mk_item( p, lo, hi, id, ast:: item_mod ( m) , attrs + inner_attrs. _0 ) ;
1871
1871
}
1872
1872
1873
- fn parse_item_native_type ( & parser p) -> @ast:: native_item {
1873
+ fn parse_item_native_type ( & parser p,
1874
+ & vec[ ast:: attribute ] attrs ) -> @ast:: native_item {
1874
1875
auto t = parse_type_decl ( p) ;
1875
1876
auto hi = p. get_hi_pos ( ) ;
1876
1877
expect ( p, token:: SEMI ) ;
1877
1878
ret @rec( ident=t. _1 ,
1879
+ attrs=attrs,
1878
1880
node=ast:: native_item_ty,
1879
1881
id=p. get_id ( ) ,
1880
1882
span=rec ( lo=t. _0 , hi=hi) ) ;
1881
1883
}
1882
1884
1883
- fn parse_item_native_fn ( & parser p) -> @ast:: native_item {
1885
+ fn parse_item_native_fn ( & parser p,
1886
+ & vec[ ast:: attribute ] attrs ) -> @ast:: native_item {
1884
1887
auto lo = p. get_last_lo_pos ( ) ;
1885
1888
auto t = parse_fn_header ( p) ;
1886
1889
auto decl = parse_fn_decl ( p, ast:: impure_fn) ;
@@ -1892,25 +1895,38 @@ fn parse_item_native_fn(&parser p) -> @ast::native_item {
1892
1895
auto hi = p. get_hi_pos ( ) ;
1893
1896
expect ( p, token:: SEMI ) ;
1894
1897
ret @rec( ident=t. _0 ,
1898
+ attrs=attrs,
1895
1899
node=ast:: native_item_fn ( link_name, decl, t. _1 ) ,
1896
1900
id=p. get_id ( ) ,
1897
1901
span=rec ( lo=lo, hi=hi) ) ;
1898
1902
}
1899
1903
1900
- fn parse_native_item ( & parser p) -> @ast:: native_item {
1904
+ fn parse_native_item ( & parser p,
1905
+ & vec[ ast:: attribute ] attrs ) -> @ast:: native_item {
1901
1906
parse_layer ( p) ;
1902
1907
if ( eat_word ( p, "type" ) ) {
1903
- ret parse_item_native_type ( p) ;
1908
+ ret parse_item_native_type ( p, attrs ) ;
1904
1909
} else if ( eat_word ( p, "fn" ) ) {
1905
- ret parse_item_native_fn ( p) ;
1910
+ ret parse_item_native_fn ( p, attrs ) ;
1906
1911
} else { unexpected ( p, p. peek ( ) ) ; fail; }
1907
1912
}
1908
1913
1909
- fn parse_native_mod_items ( & parser p, & str native_name , ast:: native_abi abi) ->
1914
+ fn parse_native_mod_items ( & parser p, & str native_name , ast:: native_abi abi,
1915
+ & vec[ ast:: attribute ] first_item_attrs ) ->
1910
1916
ast:: native_mod {
1917
+ auto view_items = if ( vec:: len ( first_item_attrs) == 0 u) {
1918
+ parse_native_view ( p)
1919
+ } else {
1920
+ // Shouldn't be any view items since we've already parsed an item attr
1921
+ [ ]
1922
+ } ;
1911
1923
let vec[ @ast:: native_item] items = [ ] ;
1912
- auto view_items = parse_native_view ( p) ;
1913
- while ( p. peek ( ) != token:: RBRACE ) { items += [ parse_native_item ( p) ] ; }
1924
+ auto initial_attrs = first_item_attrs;
1925
+ while ( p. peek ( ) != token:: RBRACE ) {
1926
+ auto attrs = initial_attrs + parse_outer_attributes ( p) ;
1927
+ initial_attrs = [ ] ;
1928
+ items += [ parse_native_item ( p, attrs) ] ;
1929
+ }
1914
1930
ret rec( native_name=native_name,
1915
1931
abi=abi,
1916
1932
view_items=view_items,
@@ -1941,10 +1957,14 @@ fn parse_item_native_mod(&parser p, vec[ast::attribute] attrs) -> @ast::item {
1941
1957
native_name = id;
1942
1958
}
1943
1959
expect ( p, token:: LBRACE ) ;
1944
- auto m = parse_native_mod_items ( p, native_name, abi) ;
1960
+ auto more_attrs = parse_inner_attrs_and_next ( p) ;
1961
+ auto inner_attrs = more_attrs. _0 ;
1962
+ auto first_item_outer_attrs = more_attrs. _1 ;
1963
+ auto m = parse_native_mod_items ( p, native_name, abi,
1964
+ first_item_outer_attrs) ;
1945
1965
auto hi = p. get_hi_pos ( ) ;
1946
1966
expect ( p, token:: RBRACE ) ;
1947
- ret mk_item( p, lo, hi, id, ast:: item_native_mod ( m) , attrs) ;
1967
+ ret mk_item( p, lo, hi, id, ast:: item_native_mod ( m) , attrs + inner_attrs ) ;
1948
1968
}
1949
1969
1950
1970
fn parse_type_decl ( & parser p) -> tup ( uint , ast:: ident ) {
0 commit comments