diff options
Diffstat (limited to 'crates/libsyntax2/src/lib.rs')
-rw-r--r-- | crates/libsyntax2/src/lib.rs | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/crates/libsyntax2/src/lib.rs b/crates/libsyntax2/src/lib.rs index 53ae18988..d3ecbe470 100644 --- a/crates/libsyntax2/src/lib.rs +++ b/crates/libsyntax2/src/lib.rs | |||
@@ -53,5 +53,31 @@ pub use { | |||
53 | 53 | ||
54 | pub fn parse(text: &str) -> SyntaxNode { | 54 | pub fn parse(text: &str) -> SyntaxNode { |
55 | let tokens = tokenize(&text); | 55 | let tokens = tokenize(&text); |
56 | parser_impl::parse::<yellow::GreenBuilder>(text, &tokens) | 56 | let res = parser_impl::parse::<yellow::GreenBuilder>(text, &tokens); |
57 | validate_block_structure(res.borrowed()); | ||
58 | res | ||
59 | } | ||
60 | |||
61 | fn validate_block_structure(root: SyntaxNodeRef) { | ||
62 | let mut stack = Vec::new(); | ||
63 | for node in algo::walk::preorder(root) { | ||
64 | match node.kind() { | ||
65 | SyntaxKind::L_CURLY => { | ||
66 | stack.push(node) | ||
67 | } | ||
68 | SyntaxKind::R_CURLY => { | ||
69 | if let Some(pair) = stack.pop() { | ||
70 | assert_eq!(node.parent(), pair.parent()); | ||
71 | assert!( | ||
72 | node.next_sibling().is_none() && pair.prev_sibling().is_none(), | ||
73 | "floating curlys at {:?}\nfile:\n{}\nerror:\n{}\n", | ||
74 | node, | ||
75 | root.text(), | ||
76 | node.text(), | ||
77 | ); | ||
78 | } | ||
79 | } | ||
80 | _ => (), | ||
81 | } | ||
82 | } | ||
57 | } | 83 | } |