diff options
Diffstat (limited to 'src/parser/mod.rs')
-rw-r--r-- | src/parser/mod.rs | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 3814837e1..26fbb6e3d 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs | |||
@@ -1,7 +1,3 @@ | |||
1 | use {File, SyntaxKind, Token}; | ||
2 | |||
3 | use syntax_kinds::*; | ||
4 | |||
5 | #[macro_use] | 1 | #[macro_use] |
6 | mod token_set; | 2 | mod token_set; |
7 | mod parser; | 3 | mod parser; |
@@ -9,6 +5,16 @@ mod input; | |||
9 | mod event; | 5 | mod event; |
10 | mod grammar; | 6 | mod grammar; |
11 | 7 | ||
8 | use std::sync::Arc; | ||
9 | use { | ||
10 | File, SyntaxKind, Token, | ||
11 | yellow::SyntaxNode, | ||
12 | syntax_kinds::* | ||
13 | }; | ||
14 | use GreenBuilder; | ||
15 | use parser::event::process; | ||
16 | |||
17 | |||
12 | /// Parse a sequence of tokens into the representative node tree | 18 | /// Parse a sequence of tokens into the representative node tree |
13 | pub fn parse(text: String, tokens: &[Token]) -> File { | 19 | pub fn parse(text: String, tokens: &[Token]) -> File { |
14 | let events = { | 20 | let events = { |
@@ -21,6 +27,21 @@ pub fn parse(text: String, tokens: &[Token]) -> File { | |||
21 | event::to_file(text, tokens, events) | 27 | event::to_file(text, tokens, events) |
22 | } | 28 | } |
23 | 29 | ||
30 | /// Parse a sequence of tokens into the representative node tree | ||
31 | pub fn parse_green(text: String, tokens: &[Token]) -> SyntaxNode { | ||
32 | let events = { | ||
33 | let input = input::ParserInput::new(&text, tokens); | ||
34 | let parser_impl = parser::imp::ParserImpl::new(&input); | ||
35 | let mut parser = parser::Parser(parser_impl); | ||
36 | grammar::file(&mut parser); | ||
37 | parser.0.into_events() | ||
38 | }; | ||
39 | let mut builder = GreenBuilder::new(text); | ||
40 | process(&mut builder, tokens, events); | ||
41 | let (green, errors) = builder.finish(); | ||
42 | SyntaxNode::new(Arc::new(green), errors) | ||
43 | } | ||
44 | |||
24 | fn is_insignificant(kind: SyntaxKind) -> bool { | 45 | fn is_insignificant(kind: SyntaxKind) -> bool { |
25 | match kind { | 46 | match kind { |
26 | WHITESPACE | COMMENT => true, | 47 | WHITESPACE | COMMENT => true, |