aboutsummaryrefslogtreecommitdiff
path: root/src/tree/file_builder.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree/file_builder.rs')
-rw-r--r--src/tree/file_builder.rs32
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 @@
1use {SyntaxKind, TextUnit, TextRange}; 1use {SyntaxKind, TextRange, TextUnit};
2use super::{NodeData, SyntaxErrorData, NodeIdx, File}; 2use super::{File, NodeData, NodeIdx, SyntaxErrorData};
3 3
4pub trait Sink { 4pub 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
12pub struct FileBuilder { 11pub 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
141pub struct ErrorBuilder<'f> { 142pub 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
146impl<'f> ErrorBuilder<'f> { 147impl<'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}