diff options
| -rw-r--r-- | crates/ra_parser/src/grammar/expressions.rs | 8 | ||||
| -rw-r--r-- | crates/ra_parser/src/grammar/items.rs | 23 |
2 files changed, 14 insertions, 17 deletions
diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs index 9839846f1..6d3e379a3 100644 --- a/crates/ra_parser/src/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs | |||
| @@ -54,7 +54,7 @@ pub(crate) fn expr_block_contents(p: &mut Parser) { | |||
| 54 | 54 | ||
| 55 | // test block_items | 55 | // test block_items |
| 56 | // fn a() { fn b() {} } | 56 | // fn a() { fn b() {} } |
| 57 | let mut m = p.start(); | 57 | let m = p.start(); |
| 58 | let has_attrs = p.at(POUND); | 58 | let has_attrs = p.at(POUND); |
| 59 | attributes::outer_attributes(p); | 59 | attributes::outer_attributes(p); |
| 60 | if p.at(LET_KW) { | 60 | if p.at(LET_KW) { |
| @@ -62,9 +62,9 @@ pub(crate) fn expr_block_contents(p: &mut Parser) { | |||
| 62 | continue; | 62 | continue; |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | m = match items::maybe_item(p, m, items::ItemFlavor::Mod) { | 65 | let m = match items::maybe_item(p, m, items::ItemFlavor::Mod) { |
| 66 | Some(m) => m, | 66 | Ok(()) => continue, |
| 67 | None => continue, | 67 | Err(m) => m, |
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| 70 | // test pub_expr | 70 | // test pub_expr |
diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs index 5411589dd..94b93a02b 100644 --- a/crates/ra_parser/src/grammar/items.rs +++ b/crates/ra_parser/src/grammar/items.rs | |||
| @@ -35,11 +35,11 @@ pub(super) const ITEM_RECOVERY_SET: TokenSet = token_set![ | |||
| 35 | ]; | 35 | ]; |
| 36 | 36 | ||
| 37 | pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool, flavor: ItemFlavor) { | 37 | pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool, flavor: ItemFlavor) { |
| 38 | let mut m = p.start(); | 38 | let m = p.start(); |
| 39 | attributes::outer_attributes(p); | 39 | attributes::outer_attributes(p); |
| 40 | m = match maybe_item(p, m, flavor) { | 40 | let m = match maybe_item(p, m, flavor) { |
| 41 | Some(m) => m, | 41 | Ok(()) => return, |
| 42 | None => return, | 42 | Err(m) => m, |
| 43 | }; | 43 | }; |
| 44 | if paths::is_path_start(p) { | 44 | if paths::is_path_start(p) { |
| 45 | match macro_call(p) { | 45 | match macro_call(p) { |
| @@ -66,11 +66,11 @@ pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool, flavor: ItemF | |||
| 66 | } | 66 | } |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Option<Marker> { | 69 | pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Result<(), Marker> { |
| 70 | opt_visibility(p); | 70 | opt_visibility(p); |
| 71 | if let Some(kind) = items_without_modifiers(p) { | 71 | if let Some(kind) = items_without_modifiers(p) { |
| 72 | m.complete(p, kind); | 72 | m.complete(p, kind); |
| 73 | return None; | 73 | return Ok(()); |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | let mut has_mods = false; | 76 | let mut has_mods = false; |
| @@ -124,7 +124,6 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Optio | |||
| 124 | FN_KW => { | 124 | FN_KW => { |
| 125 | fn_def(p, flavor); | 125 | fn_def(p, flavor); |
| 126 | m.complete(p, FN_DEF); | 126 | m.complete(p, FN_DEF); |
| 127 | None | ||
| 128 | } | 127 | } |
| 129 | 128 | ||
| 130 | // test unsafe_trait | 129 | // test unsafe_trait |
| @@ -138,7 +137,6 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Optio | |||
| 138 | TRAIT_KW => { | 137 | TRAIT_KW => { |
| 139 | traits::trait_def(p); | 138 | traits::trait_def(p); |
| 140 | m.complete(p, TRAIT_DEF); | 139 | m.complete(p, TRAIT_DEF); |
| 141 | None | ||
| 142 | } | 140 | } |
| 143 | 141 | ||
| 144 | // test unsafe_impl | 142 | // test unsafe_impl |
| @@ -152,18 +150,17 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Optio | |||
| 152 | IMPL_KW => { | 150 | IMPL_KW => { |
| 153 | traits::impl_block(p); | 151 | traits::impl_block(p); |
| 154 | m.complete(p, IMPL_BLOCK); | 152 | m.complete(p, IMPL_BLOCK); |
| 155 | None | ||
| 156 | } | 153 | } |
| 157 | _ => { | 154 | _ => { |
| 158 | if has_mods { | 155 | if !has_mods { |
| 156 | return Err(m); | ||
| 157 | } else { | ||
| 159 | p.error("expected fn, trait or impl"); | 158 | p.error("expected fn, trait or impl"); |
| 160 | m.complete(p, ERROR); | 159 | m.complete(p, ERROR); |
| 161 | None | ||
| 162 | } else { | ||
| 163 | Some(m) | ||
| 164 | } | 160 | } |
| 165 | } | 161 | } |
| 166 | } | 162 | } |
| 163 | Ok(()) | ||
| 167 | } | 164 | } |
| 168 | 165 | ||
| 169 | fn items_without_modifiers(p: &mut Parser) -> Option<SyntaxKind> { | 166 | fn items_without_modifiers(p: &mut Parser) -> Option<SyntaxKind> { |
