aboutsummaryrefslogtreecommitdiff
path: root/src/parser/event_parser/grammar/paths.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-01-20 18:49:58 +0000
committerAleksey Kladov <[email protected]>2018-01-20 18:49:58 +0000
commitbe60d5aa6669a74e92495288f44b7f9258a8518f (patch)
treeb115c6605755e903902ec2971ce2529cb87e3b8a /src/parser/event_parser/grammar/paths.rs
parent111743d82c31bcaeb3cd7abbb261c0e038c2d909 (diff)
Drop more high-order stuff
Diffstat (limited to 'src/parser/event_parser/grammar/paths.rs')
-rw-r--r--src/parser/event_parser/grammar/paths.rs59
1 files changed, 29 insertions, 30 deletions
diff --git a/src/parser/event_parser/grammar/paths.rs b/src/parser/event_parser/grammar/paths.rs
index 45f3cb779..f5124cfce 100644
--- a/src/parser/event_parser/grammar/paths.rs
+++ b/src/parser/event_parser/grammar/paths.rs
@@ -1,6 +1,6 @@
1use super::*; 1use super::*;
2 2
3pub (crate) fn is_path_start(p: &Parser) -> bool { 3pub(crate) fn is_path_start(p: &Parser) -> bool {
4 AnyOf(&[IDENT, SELF_KW, SUPER_KW, COLONCOLON]).is_ahead(p) 4 AnyOf(&[IDENT, SELF_KW, SUPER_KW, COLONCOLON]).is_ahead(p)
5} 5}
6 6
@@ -9,39 +9,38 @@ pub(crate) fn use_path(p: &mut Parser) {
9 return; 9 return;
10 } 10 }
11 let mut prev = p.mark(); 11 let mut prev = p.mark();
12 node(p, PATH, |p| { 12 p.start(PATH);
13 path_segment(p, true); 13 path_segment(p, true);
14 }); 14 p.finish();
15 repeat(p, |p| { 15 loop {
16 let curr = p.mark(); 16 let curr = p.mark();
17 if p.current() == COLONCOLON && !items::is_use_tree_start(p.raw_lookahead(1)) { 17 if p.at(COLONCOLON) && !items::is_use_tree_start(p.raw_lookahead(1)) {
18 node(p, PATH, |p| { 18 p.start(PATH);
19 p.bump(); 19 p.bump();
20 path_segment(p, false); 20 path_segment(p, false);
21 p.forward_parent(prev, curr); 21 p.forward_parent(prev, curr);
22 prev = curr; 22 prev = curr;
23 }); 23 p.finish();
24 true
25 } else { 24 } else {
26 false 25 break;
27 } 26 }
28 }); 27 }
29} 28}
30 29
31fn path_segment(p: &mut Parser, first: bool) { 30fn path_segment(p: &mut Parser, first: bool) {
32 node(p, PATH_SEGMENT, |p| { 31 p.start(PATH_SEGMENT);
33 if first { 32 if first {
34 p.eat(COLONCOLON); 33 p.eat(COLONCOLON);
34 }
35 match p.current() {
36 IDENT | SELF_KW | SUPER_KW => {
37 p.bump();
35 } 38 }
36 match p.current() { 39 _ => {
37 IDENT | SELF_KW | SUPER_KW => { 40 p.error()
38 p.bump(); 41 .message("expected identifier")
39 }, 42 .emit();
40 _ => { 43 }
41 p.error() 44 };
42 .message("expected identifier") 45 p.finish();
43 .emit(); 46}
44 }
45 };
46 })
47} \ No newline at end of file