while !p.at(EOF) && !p.at(R_CURLY) {
match p.current() {
- LET_KW => let_stmt(p),
+ LET_KW => {
+ let m = p.start();
+ let_stmt(p, m)
+ }
// test nocontentexpr
// fn foo(){
// ;;;some_expr();;;;{;;;};;;;Ok(())
_ => {
// test block_items
// fn a() { fn b() {} }
- let has_attrs = p.at(POUND);
let m = p.start();
+ let has_attrs = p.at(POUND);
+ attributes::outer_attributes(p);
match items::maybe_item(p, items::ItemFlavor::Mod) {
items::MaybeItem::Item(kind) => {
m.complete(p, kind);
// fn foo() { pub 92; } //FIXME
items::MaybeItem::None => {
if has_attrs {
- m.abandon(p);
if p.at(LET_KW) {
- let_stmt(p);
+ let_stmt(p, m);
} else {
+ m.abandon(p);
p.error("expected a let statement");
}
} else {
// let c = 92;
// let d: i32 = 92;
// }
- fn let_stmt(p: &mut Parser) {
+ fn let_stmt(p: &mut Parser, m: Marker) {
assert!(p.at(LET_KW));
- let m = p.start();
p.bump();
patterns::pattern(p);
if p.at(COLON) {
pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool, flavor: ItemFlavor) {
let m = p.start();
+ attributes::outer_attributes(p);
match maybe_item(p, flavor) {
MaybeItem::Item(kind) => {
m.complete(p, kind);
}
pub(super) fn maybe_item(p: &mut Parser, flavor: ItemFlavor) -> MaybeItem {
- attributes::outer_attributes(p);
opt_visibility(p);
if let Some(kind) = items_without_modifiers(p) {
return MaybeItem::Item(kind);