// test block_items
// fn a() { fn b() {} }
- let mut m = p.start();
+ let m = p.start();
let has_attrs = p.at(POUND);
attributes::outer_attributes(p);
if p.at(LET_KW) {
continue;
}
- m = match items::maybe_item(p, m, items::ItemFlavor::Mod) {
- Some(m) => m,
- None => continue,
+ let m = match items::maybe_item(p, m, items::ItemFlavor::Mod) {
+ Ok(()) => continue,
+ Err(m) => m,
};
// test pub_expr
];
pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool, flavor: ItemFlavor) {
- let mut m = p.start();
+ let m = p.start();
attributes::outer_attributes(p);
- m = match maybe_item(p, m, flavor) {
- Some(m) => m,
- None => return,
+ let m = match maybe_item(p, m, flavor) {
+ Ok(()) => return,
+ Err(m) => m,
};
if paths::is_path_start(p) {
match macro_call(p) {
}
}
-pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Option<Marker> {
+pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Result<(), Marker> {
opt_visibility(p);
if let Some(kind) = items_without_modifiers(p) {
m.complete(p, kind);
- return None;
+ return Ok(());
}
let mut has_mods = false;
FN_KW => {
fn_def(p, flavor);
m.complete(p, FN_DEF);
- None
}
// test unsafe_trait
TRAIT_KW => {
traits::trait_def(p);
m.complete(p, TRAIT_DEF);
- None
}
// test unsafe_impl
IMPL_KW => {
traits::impl_block(p);
m.complete(p, IMPL_BLOCK);
- None
}
_ => {
- if has_mods {
+ if !has_mods {
+ return Err(m);
+ } else {
p.error("expected fn, trait or impl");
m.complete(p, ERROR);
- None
- } else {
- Some(m)
}
}
}
+ Ok(())
}
fn items_without_modifiers(p: &mut Parser) -> Option<SyntaxKind> {