diff options
Diffstat (limited to 'src/tree/file_builder.rs')
-rw-r--r-- | src/tree/file_builder.rs | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/tree/file_builder.rs b/src/tree/file_builder.rs index 35702ddd7..939922cb2 100644 --- a/src/tree/file_builder.rs +++ b/src/tree/file_builder.rs | |||
@@ -1,5 +1,5 @@ | |||
1 | use {SyntaxKind, TextUnit, TextRange}; | 1 | use {SyntaxKind, TextRange, TextUnit}; |
2 | use super::{NodeData, SyntaxErrorData, NodeIdx, File}; | 2 | use super::{File, NodeData, NodeIdx, SyntaxErrorData}; |
3 | 3 | ||
4 | pub trait Sink { | 4 | pub trait Sink { |
5 | fn leaf(&mut self, kind: SyntaxKind, len: TextUnit); | 5 | fn leaf(&mut self, kind: SyntaxKind, len: TextUnit); |
@@ -8,7 +8,6 @@ pub trait Sink { | |||
8 | fn error(&mut self) -> ErrorBuilder; | 8 | fn error(&mut self) -> ErrorBuilder; |
9 | } | 9 | } |
10 | 10 | ||
11 | |||
12 | pub struct FileBuilder { | 11 | pub struct FileBuilder { |
13 | text: String, | 12 | text: String, |
14 | nodes: Vec<NodeData>, | 13 | nodes: Vec<NodeData>, |
@@ -48,9 +47,9 @@ impl Sink for FileBuilder { | |||
48 | } | 47 | } |
49 | 48 | ||
50 | fn finish_internal(&mut self) { | 49 | fn finish_internal(&mut self) { |
51 | let (id, _) = self.in_progress.pop().expect( | 50 | let (id, _) = self.in_progress |
52 | "trying to complete a node, but there are no in-progress nodes" | 51 | .pop() |
53 | ); | 52 | .expect("trying to complete a node, but there are no in-progress nodes"); |
54 | if !self.in_progress.is_empty() { | 53 | if !self.in_progress.is_empty() { |
55 | self.add_len(id); | 54 | self.add_len(id); |
56 | } | 55 | } |
@@ -76,11 +75,14 @@ impl FileBuilder { | |||
76 | assert!( | 75 | assert!( |
77 | self.in_progress.is_empty(), | 76 | self.in_progress.is_empty(), |
78 | "some nodes in FileBuilder are unfinished: {:?}", | 77 | "some nodes in FileBuilder are unfinished: {:?}", |
79 | self.in_progress.iter().map(|&(idx, _)| self.nodes[idx].kind) | 78 | self.in_progress |
79 | .iter() | ||
80 | .map(|&(idx, _)| self.nodes[idx].kind) | ||
80 | .collect::<Vec<_>>() | 81 | .collect::<Vec<_>>() |
81 | ); | 82 | ); |
82 | assert_eq!( | 83 | assert_eq!( |
83 | self.pos, (self.text.len() as u32).into(), | 84 | self.pos, |
85 | (self.text.len() as u32).into(), | ||
84 | "nodes in FileBuilder do not cover the whole file" | 86 | "nodes in FileBuilder do not cover the whole file" |
85 | ); | 87 | ); |
86 | File { | 88 | File { |
@@ -100,7 +102,6 @@ impl FileBuilder { | |||
100 | child.parent = Some(self.current_id()); | 102 | child.parent = Some(self.current_id()); |
101 | let id = self.new_node(child); | 103 | let id = self.new_node(child); |
102 | { | 104 | { |
103 | |||
104 | let (parent, sibling) = *self.in_progress.last().unwrap(); | 105 | let (parent, sibling) = *self.in_progress.last().unwrap(); |
105 | let slot = if let Some(idx) = sibling { | 106 | let slot = if let Some(idx) = sibling { |
106 | &mut self.nodes[idx].next_sibling | 107 | &mut self.nodes[idx].next_sibling |
@@ -140,12 +141,15 @@ fn grow(left: &mut TextRange, right: TextRange) { | |||
140 | 141 | ||
141 | pub struct ErrorBuilder<'f> { | 142 | pub struct ErrorBuilder<'f> { |
142 | message: Option<String>, | 143 | message: Option<String>, |
143 | builder: &'f mut FileBuilder | 144 | builder: &'f mut FileBuilder, |
144 | } | 145 | } |
145 | 146 | ||
146 | impl<'f> ErrorBuilder<'f> { | 147 | impl<'f> ErrorBuilder<'f> { |
147 | fn new(builder: &'f mut FileBuilder) -> Self { | 148 | fn new(builder: &'f mut FileBuilder) -> Self { |
148 | ErrorBuilder { message: None, builder } | 149 | ErrorBuilder { |
150 | message: None, | ||
151 | builder, | ||
152 | } | ||
149 | } | 153 | } |
150 | 154 | ||
151 | pub fn message<M: Into<String>>(mut self, m: M) -> Self { | 155 | pub fn message<M: Into<String>>(mut self, m: M) -> Self { |
@@ -156,6 +160,10 @@ impl<'f> ErrorBuilder<'f> { | |||
156 | pub fn emit(self) { | 160 | pub fn emit(self) { |
157 | let message = self.message.expect("Error message not set"); | 161 | let message = self.message.expect("Error message not set"); |
158 | let &(node, after_child) = self.builder.in_progress.last().unwrap(); | 162 | let &(node, after_child) = self.builder.in_progress.last().unwrap(); |
159 | self.builder.errors.push(SyntaxErrorData { node, message, after_child }) | 163 | self.builder.errors.push(SyntaxErrorData { |
164 | node, | ||
165 | message, | ||
166 | after_child, | ||
167 | }) | ||
160 | } | 168 | } |
161 | } | 169 | } |