aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/syntax_node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/src/syntax_node.rs')
-rw-r--r--crates/ra_syntax/src/syntax_node.rs55
1 files changed, 10 insertions, 45 deletions
diff --git a/crates/ra_syntax/src/syntax_node.rs b/crates/ra_syntax/src/syntax_node.rs
index 80054f529..4105b5220 100644
--- a/crates/ra_syntax/src/syntax_node.rs
+++ b/crates/ra_syntax/src/syntax_node.rs
@@ -9,7 +9,6 @@
9use std::{ 9use std::{
10 ops::RangeInclusive, 10 ops::RangeInclusive,
11 fmt::{self, Write}, 11 fmt::{self, Write},
12 any::Any,
13 borrow::Borrow, 12 borrow::Borrow,
14 iter::successors, 13 iter::successors,
15}; 14};
@@ -133,10 +132,8 @@ pub enum Direction {
133} 132}
134 133
135impl SyntaxNode { 134impl SyntaxNode {
136 pub(crate) fn new(green: GreenNode, errors: Vec<SyntaxError>) -> TreeArc<SyntaxNode> { 135 pub(crate) fn new(green: GreenNode) -> TreeArc<SyntaxNode> {
137 let errors: Option<Box<Any + Send + Sync>> = 136 let ptr = TreeArc(rowan::SyntaxNode::new(green, None));
138 if errors.is_empty() { None } else { Some(Box::new(errors)) };
139 let ptr = TreeArc(rowan::SyntaxNode::new(green, errors));
140 TreeArc::cast(ptr) 137 TreeArc::cast(ptr)
141 } 138 }
142 139
@@ -259,37 +256,18 @@ impl SyntaxNode {
259 } 256 }
260 257
261 pub fn debug_dump(&self) -> String { 258 pub fn debug_dump(&self) -> String {
262 let mut errors: Vec<_> = match self.ancestors().find_map(SourceFile::cast) {
263 Some(file) => file.errors(),
264 None => self.root_data().to_vec(),
265 };
266 errors.sort_by_key(|e| e.offset());
267 let mut err_pos = 0;
268 let mut level = 0; 259 let mut level = 0;
269 let mut buf = String::new(); 260 let mut buf = String::new();
270 macro_rules! indent {
271 () => {
272 for _ in 0..level {
273 buf.push_str(" ");
274 }
275 };
276 }
277 261
278 for event in self.preorder_with_tokens() { 262 for event in self.preorder_with_tokens() {
279 match event { 263 match event {
280 WalkEvent::Enter(element) => { 264 WalkEvent::Enter(element) => {
281 indent!(); 265 for _ in 0..level {
266 buf.push_str(" ");
267 }
282 match element { 268 match element {
283 SyntaxElement::Node(node) => writeln!(buf, "{:?}", node).unwrap(), 269 SyntaxElement::Node(node) => writeln!(buf, "{:?}", node).unwrap(),
284 SyntaxElement::Token(token) => { 270 SyntaxElement::Token(token) => writeln!(buf, "{:?}", token).unwrap(),
285 writeln!(buf, "{:?}", token).unwrap();
286 let off = token.range().end();
287 while err_pos < errors.len() && errors[err_pos].offset() <= off {
288 indent!();
289 writeln!(buf, "err: `{}`", errors[err_pos]).unwrap();
290 err_pos += 1;
291 }
292 }
293 } 271 }
294 level += 1; 272 level += 1;
295 } 273 }
@@ -298,23 +276,10 @@ impl SyntaxNode {
298 } 276 }
299 277
300 assert_eq!(level, 0); 278 assert_eq!(level, 0);
301 for err in errors[err_pos..].iter() {
302 writeln!(buf, "err: `{}`", err).unwrap();
303 }
304 279
305 buf 280 buf
306 } 281 }
307 282
308 pub(crate) fn root_data(&self) -> &[SyntaxError] {
309 match self.0.root_data() {
310 None => &[],
311 Some(data) => {
312 let data: &Vec<SyntaxError> = std::any::Any::downcast_ref(data).unwrap();
313 data.as_slice()
314 }
315 }
316 }
317
318 pub(crate) fn replace_with(&self, replacement: GreenNode) -> GreenNode { 283 pub(crate) fn replace_with(&self, replacement: GreenNode) -> GreenNode {
319 self.0.replace_with(replacement) 284 self.0.replace_with(replacement)
320 } 285 }
@@ -386,7 +351,7 @@ impl SyntaxNode {
386 let len = new_children.iter().map(|it| it.text_len()).sum::<TextUnit>(); 351 let len = new_children.iter().map(|it| it.text_len()).sum::<TextUnit>();
387 let new_node = GreenNode::new(rowan::SyntaxKind(self.kind() as u16), new_children); 352 let new_node = GreenNode::new(rowan::SyntaxKind(self.kind() as u16), new_children);
388 let new_file_node = self.replace_with(new_node); 353 let new_file_node = self.replace_with(new_node);
389 let file = SourceFile::new(new_file_node, Vec::new()); 354 let file = SourceFile::new(new_file_node);
390 355
391 // FIXME: use a more elegant way to re-fetch the node (#1185), make 356 // FIXME: use a more elegant way to re-fetch the node (#1185), make
392 // `range` private afterwards 357 // `range` private afterwards
@@ -629,13 +594,13 @@ impl SyntaxTreeBuilder {
629 (green, self.errors) 594 (green, self.errors)
630 } 595 }
631 596
632 pub fn finish(self) -> TreeArc<SyntaxNode> { 597 pub fn finish(self) -> (TreeArc<SyntaxNode>, Vec<SyntaxError>) {
633 let (green, errors) = self.finish_raw(); 598 let (green, errors) = self.finish_raw();
634 let node = SyntaxNode::new(green, errors); 599 let node = SyntaxNode::new(green);
635 if cfg!(debug_assertions) { 600 if cfg!(debug_assertions) {
636 crate::validation::validate_block_structure(&node); 601 crate::validation::validate_block_structure(&node);
637 } 602 }
638 node 603 (node, errors)
639 } 604 }
640 605
641 pub fn token(&mut self, kind: SyntaxKind, text: SmolStr) { 606 pub fn token(&mut self, kind: SyntaxKind, text: SmolStr) {