@@ -3871,9 +3871,14 @@ impl Parser {
|
|||||||
Some(inner_attrs))
|
Some(inner_attrs))
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse a method in a trait impl
|
// parse a method in a trait impl, starting with `attrs` attributes.
|
||||||
fn parse_method(&self) -> @method {
|
fn parse_method(&self, already_parsed_attrs: Option<~[Attribute]>) -> @method {
|
||||||
let attrs = self.parse_outer_attributes();
|
let next_attrs = self.parse_outer_attributes();
|
||||||
|
let attrs = match already_parsed_attrs {
|
||||||
|
Some(mut a) => { a.push_all_move(next_attrs); a }
|
||||||
|
None => next_attrs
|
||||||
|
};
|
||||||
|
|
||||||
let lo = self.span.lo;
|
let lo = self.span.lo;
|
||||||
|
|
||||||
let visa = self.parse_visibility();
|
let visa = self.parse_visibility();
|
||||||
@@ -3966,16 +3971,21 @@ impl Parser {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let mut meths = ~[];
|
let mut meths = ~[];
|
||||||
if self.eat(&token::SEMI) {
|
let inner_attrs = if self.eat(&token::SEMI) {
|
||||||
self.obsolete(*self.last_span, ObsoleteEmptyImpl);
|
self.obsolete(*self.last_span, ObsoleteEmptyImpl);
|
||||||
|
None
|
||||||
} else {
|
} else {
|
||||||
self.expect(&token::LBRACE);
|
self.expect(&token::LBRACE);
|
||||||
|
let (inner_attrs, next) = self.parse_inner_attrs_and_next();
|
||||||
|
let mut method_attrs = Some(next);
|
||||||
while !self.eat(&token::RBRACE) {
|
while !self.eat(&token::RBRACE) {
|
||||||
meths.push(self.parse_method());
|
meths.push(self.parse_method(method_attrs));
|
||||||
}
|
method_attrs = None;
|
||||||
}
|
}
|
||||||
|
Some(inner_attrs)
|
||||||
|
};
|
||||||
|
|
||||||
(ident, item_impl(generics, opt_trait, ty, meths), None)
|
(ident, item_impl(generics, opt_trait, ty, meths), inner_attrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse a::B<~str,int>
|
// parse a::B<~str,int>
|
||||||
|
|||||||
@@ -596,6 +596,7 @@ pub fn print_item(s: @ps, item: &ast::item) {
|
|||||||
|
|
||||||
space(s.s);
|
space(s.s);
|
||||||
bopen(s);
|
bopen(s);
|
||||||
|
print_inner_attributes(s, item.attrs);
|
||||||
for meth in methods.iter() {
|
for meth in methods.iter() {
|
||||||
print_method(s, *meth);
|
print_method(s, *meth);
|
||||||
}
|
}
|
||||||
|
|||||||
33
src/test/run-pass/inner-attrs-on-impl.rs
Normal file
33
src/test/run-pass/inner-attrs-on-impl.rs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
|
||||||
|
impl Foo {
|
||||||
|
#[cfg(cfg_that_surely_doesnt_exist)];
|
||||||
|
|
||||||
|
fn method(&self) -> bool { false }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Foo {
|
||||||
|
#[cfg(not(cfg_that_surely_doesnt_exist))];
|
||||||
|
|
||||||
|
// check that we don't eat attributes too eagerly.
|
||||||
|
#[cfg(cfg_that_surely_doesnt_exist)]
|
||||||
|
fn method(&self) -> bool { false }
|
||||||
|
|
||||||
|
fn method(&self) -> bool { true }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
assert!(Foo.method());
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user