diff options
author | Aleksey Kladov <[email protected]> | 2019-02-23 13:55:01 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-02-23 13:55:01 +0000 |
commit | f078f7adc8ac0ffae07462d736083807c98c0483 (patch) | |
tree | e2f6611aaaf1459bb587f47dacaad9f07c4a8110 /crates/ra_syntax/src/syntax_node.rs | |
parent | 0c1cb981820c55127c3c09d93868814a1df98246 (diff) |
introduce tree builder
Diffstat (limited to 'crates/ra_syntax/src/syntax_node.rs')
-rw-r--r-- | crates/ra_syntax/src/syntax_node.rs | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/crates/ra_syntax/src/syntax_node.rs b/crates/ra_syntax/src/syntax_node.rs index 4d54ae614..e5b4cdb11 100644 --- a/crates/ra_syntax/src/syntax_node.rs +++ b/crates/ra_syntax/src/syntax_node.rs | |||
@@ -11,11 +11,12 @@ use std::{ | |||
11 | borrow::Borrow, | 11 | borrow::Borrow, |
12 | }; | 12 | }; |
13 | 13 | ||
14 | use rowan::{Types, TransparentNewType}; | 14 | use ra_parser::ParseError; |
15 | use rowan::{Types, TransparentNewType, GreenNodeBuilder}; | ||
15 | 16 | ||
16 | use crate::{ | 17 | use crate::{ |
17 | SmolStr, SyntaxKind, TextRange, SyntaxText, SourceFile, AstNode, | 18 | SmolStr, SyntaxKind, TextUnit, TextRange, SyntaxText, SourceFile, AstNode, |
18 | syntax_error::SyntaxError, | 19 | syntax_error::{SyntaxError, SyntaxErrorKind}, |
19 | }; | 20 | }; |
20 | 21 | ||
21 | pub use rowan::WalkEvent; | 22 | pub use rowan::WalkEvent; |
@@ -276,3 +277,47 @@ fn has_short_text(kind: SyntaxKind) -> bool { | |||
276 | _ => false, | 277 | _ => false, |
277 | } | 278 | } |
278 | } | 279 | } |
280 | |||
281 | pub struct SyntaxTreeBuilder { | ||
282 | errors: Vec<SyntaxError>, | ||
283 | inner: GreenNodeBuilder<RaTypes>, | ||
284 | } | ||
285 | |||
286 | impl Default for SyntaxTreeBuilder { | ||
287 | fn default() -> SyntaxTreeBuilder { | ||
288 | SyntaxTreeBuilder { errors: Vec::new(), inner: GreenNodeBuilder::new() } | ||
289 | } | ||
290 | } | ||
291 | |||
292 | impl SyntaxTreeBuilder { | ||
293 | pub(crate) fn finish_raw(self) -> (GreenNode, Vec<SyntaxError>) { | ||
294 | let green = self.inner.finish(); | ||
295 | (green, self.errors) | ||
296 | } | ||
297 | |||
298 | pub fn finish(self) -> TreeArc<SyntaxNode> { | ||
299 | let (green, errors) = self.finish_raw(); | ||
300 | let node = SyntaxNode::new(green, errors); | ||
301 | if cfg!(debug_assertions) { | ||
302 | crate::validation::validate_block_structure(&node); | ||
303 | } | ||
304 | node | ||
305 | } | ||
306 | |||
307 | pub fn leaf(&mut self, kind: SyntaxKind, text: SmolStr) { | ||
308 | self.inner.leaf(kind, text) | ||
309 | } | ||
310 | |||
311 | pub fn start_branch(&mut self, kind: SyntaxKind) { | ||
312 | self.inner.start_internal(kind) | ||
313 | } | ||
314 | |||
315 | pub fn finish_branch(&mut self) { | ||
316 | self.inner.finish_internal() | ||
317 | } | ||
318 | |||
319 | pub fn error(&mut self, error: ParseError, text_pos: TextUnit) { | ||
320 | let error = SyntaxError::new(SyntaxErrorKind::ParseError(error), text_pos); | ||
321 | self.errors.push(error) | ||
322 | } | ||
323 | } | ||