about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAleksey Kladov <aleksey.kladov@gmail.com>2021-09-26 15:49:23 +0300
committerAleksey Kladov <aleksey.kladov@gmail.com>2021-09-26 15:49:23 +0300
commitdefe805fb763f3d4b11cbbe3dde460b825eea1ae (patch)
tree1cb0a06d6cf0ffa03b9e48944c2b627d3fd99a65
parent06181008551b4f920d6e91e1f6bc270d78428bc6 (diff)
downloadrust-defe805fb763f3d4b11cbbe3dde460b825eea1ae.tar.gz
rust-defe805fb763f3d4b11cbbe3dde460b825eea1ae.zip
internal: fix and force-disable block validation ;-(
Originally we tried to maintain the invariant that `{}` always match.
That is, that in the parse tree the pair of corresponding `{}` is always
first and last tokens of some nodes.

We had the code to validate that, but apparently it's been broken for
**years** since we introduced tokens/nodes split. Fixing it now makes
some tests fail.

It's unclear if we want to keep this invariant: there's a strong
motivation for breaking it in the following case:

```
use std::{ // unclosed paren

fn main() {

}

} // don't actually want to pair up this with the one from `use`
```

So let's fix the code, but disable it for the time being
-rw-r--r--crates/syntax/src/lib.rs4
-rw-r--r--crates/syntax/src/syntax_node.rs2
-rw-r--r--crates/syntax/src/validation.rs7
3 files changed, 5 insertions, 8 deletions
diff --git a/crates/syntax/src/lib.rs b/crates/syntax/src/lib.rs
index ea0de4f28d4..40460e18c36 100644
--- a/crates/syntax/src/lib.rs
+++ b/crates/syntax/src/lib.rs
@@ -162,10 +162,6 @@ impl SourceFile {
         let (green, mut errors) = parsing::parse_text(text);
         let root = SyntaxNode::new_root(green.clone());
 
-        if cfg!(debug_assertions) {
-            validation::validate_block_structure(&root);
-        }
-
         errors.extend(validation::validate(&root));
 
         assert_eq!(root.kind(), SyntaxKind::SOURCE_FILE);
diff --git a/crates/syntax/src/syntax_node.rs b/crates/syntax/src/syntax_node.rs
index 6e838dd2292..0ddfd439dce 100644
--- a/crates/syntax/src/syntax_node.rs
+++ b/crates/syntax/src/syntax_node.rs
@@ -47,7 +47,7 @@ impl SyntaxTreeBuilder {
 
     pub fn finish(self) -> Parse<SyntaxNode> {
         let (green, errors) = self.finish_raw();
-        if cfg!(debug_assertions) {
+        if cfg!(debug_assertions) && false {
             let node = SyntaxNode::new_root(green.clone());
             crate::validation::validate_block_structure(&node);
         }
diff --git a/crates/syntax/src/validation.rs b/crates/syntax/src/validation.rs
index 745419f0741..a7c469ffdf2 100644
--- a/crates/syntax/src/validation.rs
+++ b/crates/syntax/src/validation.rs
@@ -170,7 +170,7 @@ fn validate_literal(literal: ast::Literal, acc: &mut Vec<SyntaxError>) {
 
 pub(crate) fn validate_block_structure(root: &SyntaxNode) {
     let mut stack = Vec::new();
-    for node in root.descendants() {
+    for node in root.descendants_with_tokens() {
         match node.kind() {
             T!['{'] => stack.push(node),
             T!['}'] => {
@@ -183,11 +183,12 @@ pub(crate) fn validate_block_structure(root: &SyntaxNode) {
                         root,
                     );
                     assert!(
-                        node.next_sibling().is_none() && pair.prev_sibling().is_none(),
+                        node.next_sibling_or_token().is_none()
+                            && pair.prev_sibling_or_token().is_none(),
                         "\nfloating curlys at {:?}\nfile:\n{}\nerror:\n{}\n",
                         node,
                         root.text(),
-                        node.text(),
+                        node,
                     );
                 }
             }