diff options
Diffstat (limited to 'src/parser/event_parser/grammar/paths.rs')
-rw-r--r-- | src/parser/event_parser/grammar/paths.rs | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/parser/event_parser/grammar/paths.rs b/src/parser/event_parser/grammar/paths.rs index d6887a9ba..62d1a3bb2 100644 --- a/src/parser/event_parser/grammar/paths.rs +++ b/src/parser/event_parser/grammar/paths.rs | |||
@@ -1,7 +1,11 @@ | |||
1 | use super::*; | 1 | use super::*; |
2 | 2 | ||
3 | pub (crate) fn is_path_start(p: &Parser) -> bool { | ||
4 | AnyOf(&[IDENT, SELF_KW, SUPER_KW, COLONCOLON]).is_ahead(p) | ||
5 | } | ||
6 | |||
3 | pub(crate) fn use_path(p: &mut Parser) { | 7 | pub(crate) fn use_path(p: &mut Parser) { |
4 | if !AnyOf(&[IDENT, SELF_KW, SUPER_KW, COLONCOLON]).is_ahead(p) { | 8 | if !is_path_start(p) { |
5 | return; | 9 | return; |
6 | } | 10 | } |
7 | let mut prev = p.mark(); | 11 | let mut prev = p.mark(); |
@@ -10,11 +14,17 @@ pub(crate) fn use_path(p: &mut Parser) { | |||
10 | }); | 14 | }); |
11 | many(p, |p| { | 15 | many(p, |p| { |
12 | let curr = p.mark(); | 16 | let curr = p.mark(); |
13 | node_if(p, COLONCOLON, PATH, |p| { | 17 | if p.current() == COLONCOLON && !items::is_use_tree_start(p.raw_lookahead(1)) { |
14 | path_segment(p, false); | 18 | node(p, PATH, |p| { |
15 | p.forward_parent(prev, curr); | 19 | p.bump(); |
16 | prev = curr; | 20 | path_segment(p, false); |
17 | }) | 21 | p.forward_parent(prev, curr); |
22 | prev = curr; | ||
23 | }); | ||
24 | true | ||
25 | } else { | ||
26 | false | ||
27 | } | ||
18 | }); | 28 | }); |
19 | } | 29 | } |
20 | 30 | ||