From f7f99af0a60ff80097377c1a041bcdeaf33c38de Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 21 Feb 2019 15:51:22 +0300 Subject: kill utils module --- crates/ra_syntax/src/validation.rs | 41 ++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) (limited to 'crates/ra_syntax/src/validation.rs') diff --git a/crates/ra_syntax/src/validation.rs b/crates/ra_syntax/src/validation.rs index 69958f0d7..69f344d65 100644 --- a/crates/ra_syntax/src/validation.rs +++ b/crates/ra_syntax/src/validation.rs @@ -5,7 +5,8 @@ mod string; mod block; use crate::{ - SourceFile, SyntaxError, AstNode, + SourceFile, SyntaxError, AstNode, SyntaxNode, + SyntaxKind::{L_CURLY, R_CURLY}, ast, algo::visit::{visitor_ctx, VisitorCtx}, }; @@ -14,12 +15,40 @@ pub(crate) fn validate(file: &SourceFile) -> Vec { let mut errors = Vec::new(); for node in file.syntax().descendants() { let _ = visitor_ctx(&mut errors) - .visit::(self::byte::validate_byte_node) - .visit::(self::byte_string::validate_byte_string_node) - .visit::(self::char::validate_char_node) - .visit::(self::string::validate_string_node) - .visit::(self::block::validate_block_node) + .visit::(byte::validate_byte_node) + .visit::(byte_string::validate_byte_string_node) + .visit::(char::validate_char_node) + .visit::(string::validate_string_node) + .visit::(block::validate_block_node) .accept(node); } errors } + +pub(crate) fn validate_block_structure(root: &SyntaxNode) { + let mut stack = Vec::new(); + for node in root.descendants() { + match node.kind() { + L_CURLY => stack.push(node), + R_CURLY => { + if let Some(pair) = stack.pop() { + assert_eq!( + node.parent(), + pair.parent(), + "\nunpaired curleys:\n{}\n{}\n", + root.text(), + root.debug_dump(), + ); + assert!( + node.next_sibling().is_none() && pair.prev_sibling().is_none(), + "\nfloating curlys at {:?}\nfile:\n{}\nerror:\n{}\n", + node, + root.text(), + node.text(), + ); + } + } + _ => (), + } + } +} -- cgit v1.2.3