diff options
Diffstat (limited to 'crates/ra_syntax/src/syntax_node.rs')
-rw-r--r-- | crates/ra_syntax/src/syntax_node.rs | 55 |
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 @@ | |||
9 | use std::{ | 9 | use 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 | ||
135 | impl SyntaxNode { | 134 | impl 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) { |