From a7254201df07fb929ca689857d7472564d484c3e Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Mon, 8 Apr 2019 00:12:07 +0800 Subject: Combine all tokensource to one and refactoring --- crates/ra_mbe/src/subtree_parser.rs | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 crates/ra_mbe/src/subtree_parser.rs (limited to 'crates/ra_mbe/src/subtree_parser.rs') diff --git a/crates/ra_mbe/src/subtree_parser.rs b/crates/ra_mbe/src/subtree_parser.rs new file mode 100644 index 000000000..48eee6fa7 --- /dev/null +++ b/crates/ra_mbe/src/subtree_parser.rs @@ -0,0 +1,59 @@ +use crate::subtree_source::SubtreeTokenSource; + +use ra_parser::{TokenSource, TreeSink}; +use ra_syntax::{SyntaxKind}; + +struct OffsetTokenSink { + token_pos: usize, +} + +impl TreeSink for OffsetTokenSink { + fn token(&mut self, _kind: SyntaxKind, n_tokens: u8) { + self.token_pos += n_tokens as usize; + } + fn start_node(&mut self, _kind: SyntaxKind) {} + fn finish_node(&mut self) {} + fn error(&mut self, _error: ra_parser::ParseError) {} +} + +pub(crate) struct Parser<'a> { + subtree: &'a tt::Subtree, + pos: &'a mut usize, +} + +impl<'a> Parser<'a> { + pub fn new(pos: &'a mut usize, subtree: &'a tt::Subtree) -> Parser<'a> { + Parser { pos, subtree } + } + + pub fn parse_path(self) -> Option { + self.parse(ra_parser::parse_path) + } + + fn parse(self, f: F) -> Option + where + F: FnOnce(&dyn TokenSource, &mut dyn TreeSink), + { + let mut src = SubtreeTokenSource::new(self.subtree); + src.advance(*self.pos, true); + let mut sink = OffsetTokenSink { token_pos: 0 }; + + f(&src, &mut sink); + + self.finish(sink.token_pos, &mut src) + } + + fn finish(self, parsed_token: usize, src: &mut SubtreeTokenSource) -> Option { + let res = src.bump_n(parsed_token, self.pos); + let res: Vec<_> = res.into_iter().cloned().collect(); + + match res.len() { + 0 => None, + 1 => Some(res[0].clone()), + _ => Some(tt::TokenTree::Subtree(tt::Subtree { + delimiter: tt::Delimiter::None, + token_trees: res, + })), + } + } +} -- cgit v1.2.3 From 2697ecaa64570841f0ed2a3ca5bc02cf41dccc4a Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Mon, 8 Apr 2019 15:58:02 +0800 Subject: Use SubtreeWalker instread of flatten TtToken --- crates/ra_mbe/src/subtree_parser.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'crates/ra_mbe/src/subtree_parser.rs') diff --git a/crates/ra_mbe/src/subtree_parser.rs b/crates/ra_mbe/src/subtree_parser.rs index 48eee6fa7..f198c8224 100644 --- a/crates/ra_mbe/src/subtree_parser.rs +++ b/crates/ra_mbe/src/subtree_parser.rs @@ -18,12 +18,12 @@ impl TreeSink for OffsetTokenSink { pub(crate) struct Parser<'a> { subtree: &'a tt::Subtree, - pos: &'a mut usize, + cur_pos: &'a mut usize, } impl<'a> Parser<'a> { - pub fn new(pos: &'a mut usize, subtree: &'a tt::Subtree) -> Parser<'a> { - Parser { pos, subtree } + pub fn new(cur_pos: &'a mut usize, subtree: &'a tt::Subtree) -> Parser<'a> { + Parser { cur_pos, subtree } } pub fn parse_path(self) -> Option { @@ -35,7 +35,7 @@ impl<'a> Parser<'a> { F: FnOnce(&dyn TokenSource, &mut dyn TreeSink), { let mut src = SubtreeTokenSource::new(self.subtree); - src.advance(*self.pos, true); + src.start_from_nth(*self.cur_pos); let mut sink = OffsetTokenSink { token_pos: 0 }; f(&src, &mut sink); @@ -44,7 +44,7 @@ impl<'a> Parser<'a> { } fn finish(self, parsed_token: usize, src: &mut SubtreeTokenSource) -> Option { - let res = src.bump_n(parsed_token, self.pos); + let res = src.bump_n(parsed_token, self.cur_pos); let res: Vec<_> = res.into_iter().cloned().collect(); match res.len() { -- cgit v1.2.3 From 8ed710457875e6f580a0ddf6ab29c6b10d389a41 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Mon, 8 Apr 2019 20:32:21 +0800 Subject: Refactoring and add some docs --- crates/ra_mbe/src/subtree_parser.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'crates/ra_mbe/src/subtree_parser.rs') diff --git a/crates/ra_mbe/src/subtree_parser.rs b/crates/ra_mbe/src/subtree_parser.rs index f198c8224..ce39a40bb 100644 --- a/crates/ra_mbe/src/subtree_parser.rs +++ b/crates/ra_mbe/src/subtree_parser.rs @@ -44,7 +44,9 @@ impl<'a> Parser<'a> { } fn finish(self, parsed_token: usize, src: &mut SubtreeTokenSource) -> Option { - let res = src.bump_n(parsed_token, self.cur_pos); + let res = src.bump_n(parsed_token); + *self.cur_pos += res.len(); + let res: Vec<_> = res.into_iter().cloned().collect(); match res.len() { -- cgit v1.2.3