From c111a1f7b8b9da2b4691c792e1658b2888ff5420 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 12 Jan 2018 20:59:19 +0300 Subject: Nest paths --- src/parser/event_parser/grammar/mod.rs | 2 +- src/parser/event_parser/grammar/paths.rs | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'src/parser') diff --git a/src/parser/event_parser/grammar/mod.rs b/src/parser/event_parser/grammar/mod.rs index 76f62b714..3c4b223a9 100644 --- a/src/parser/event_parser/grammar/mod.rs +++ b/src/parser/event_parser/grammar/mod.rs @@ -40,7 +40,7 @@ fn node(p: &mut Parser, node_kind: SyntaxKind, rest: F) p.finish(); } -fn many bool>(p: &mut Parser, f: F) { +fn many bool>(p: &mut Parser, mut f: F) { loop { let pos = p.pos(); if !f(p) { diff --git a/src/parser/event_parser/grammar/paths.rs b/src/parser/event_parser/grammar/paths.rs index 16a8ce239..108545bc2 100644 --- a/src/parser/event_parser/grammar/paths.rs +++ b/src/parser/event_parser/grammar/paths.rs @@ -4,12 +4,16 @@ pub(crate) fn use_path(p: &mut Parser) { if !AnyOf(&[IDENT, COLONCOLON]).is_ahead(p) { return; } + let mut prev = p.mark(); node(p, PATH, |p| { path_segment(p, true); }); many(p, |p| { + let curr = p.mark(); node_if(p, COLONCOLON, PATH, |p| { path_segment(p, false); + p.forward_parent(prev, curr); + prev = curr; }) }); } -- cgit v1.2.3