aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_parser/src/lib.rs
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-04-14 15:16:42 +0100
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-04-14 15:16:42 +0100
commit5d35f284f5ac70cde5d758e7c63a38eae0fb0b55 (patch)
tree4cde8df0f4a496bb1f38b3e3479ce462fc1f7426 /crates/ra_parser/src/lib.rs
parentfcbd0269545f2b6687a64a868654c74f876b7851 (diff)
parent6646d49f238bb92d55fcb4900830f19faa2994a5 (diff)
Merge #1138
1138: Add L_DOLLAR and R_DOLLAR r=matklad a=edwin0cheng As discussion in issue https://github.com/rust-analyzer/rust-analyzer/issues/1132 and PR #1125 , this PR add 2 `Syntax::Kind` : `L_DOLLAR` and `R_DOLLAR` for representing `Delimiter::None` in mbe and proc_marco. By design, It should not affect the final syntax tree, and will be discard in `TreeSink`. My original idea is handling these 2 tokens case by case, but i found that they will appear in every place in the parser (imagine `tt` matcher). So this PR only handle it in `Parser::do_bump` and `Parser::start`, although It will not fix the `expr` matcher executing order problem in original idea. Co-authored-by: Edwin Cheng <[email protected]>
Diffstat (limited to 'crates/ra_parser/src/lib.rs')
-rw-r--r--crates/ra_parser/src/lib.rs33
1 files changed, 26 insertions, 7 deletions
diff --git a/crates/ra_parser/src/lib.rs b/crates/ra_parser/src/lib.rs
index 3ceeeebd7..56755c394 100644
--- a/crates/ra_parser/src/lib.rs
+++ b/crates/ra_parser/src/lib.rs
@@ -53,20 +53,39 @@ pub trait TreeSink {
53 fn error(&mut self, error: ParseError); 53 fn error(&mut self, error: ParseError);
54} 54}
55 55
56/// Parse given tokens into the given sink as a rust file. 56fn parse_from_tokens<F>(token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink, f: F)
57pub fn parse(token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink) { 57where
58 F: FnOnce(&mut parser::Parser),
59{
58 let mut p = parser::Parser::new(token_source); 60 let mut p = parser::Parser::new(token_source);
59 grammar::root(&mut p); 61 f(&mut p);
60 let events = p.finish(); 62 let events = p.finish();
61 event::process(tree_sink, events); 63 event::process(tree_sink, events);
62} 64}
63 65
66/// Parse given tokens into the given sink as a rust file.
67pub fn parse(token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink) {
68 parse_from_tokens(token_source, tree_sink, grammar::root);
69}
70
64/// Parse given tokens into the given sink as a path 71/// Parse given tokens into the given sink as a path
65pub fn parse_path(token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink) { 72pub fn parse_path(token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink) {
66 let mut p = parser::Parser::new(token_source); 73 parse_from_tokens(token_source, tree_sink, grammar::path);
67 grammar::path(&mut p); 74}
68 let events = p.finish(); 75
69 event::process(tree_sink, events); 76/// Parse given tokens into the given sink as a expression
77pub fn parse_expr(token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink) {
78 parse_from_tokens(token_source, tree_sink, grammar::expr);
79}
80
81/// Parse given tokens into the given sink as a ty
82pub fn parse_ty(token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink) {
83 parse_from_tokens(token_source, tree_sink, grammar::type_);
84}
85
86/// Parse given tokens into the given sink as a pattern
87pub fn parse_pat(token_source: &dyn TokenSource, tree_sink: &mut dyn TreeSink) {
88 parse_from_tokens(token_source, tree_sink, grammar::pattern);
70} 89}
71 90
72/// A parsing function for a specific braced-block. 91/// A parsing function for a specific braced-block.