]> git.lizzy.rs Git - rust.git/commitdiff
Move inclusive range check to validation
authorGeoffry Song <goffrie@gmail.com>
Fri, 15 Nov 2019 09:04:37 +0000 (01:04 -0800)
committerGeoffry Song <goffrie@gmail.com>
Fri, 15 Nov 2019 09:04:45 +0000 (01:04 -0800)
crates/ra_parser/src/grammar/expressions.rs
crates/ra_syntax/src/syntax_error.rs
crates/ra_syntax/src/validation.rs
crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.rs
crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.txt

index cf69da25adac43c8ab8700d74fcda5eb519c5b70..81d4f75f99a4e4748225cd49e672452e4e6ea1af 100644 (file)
@@ -300,9 +300,6 @@ fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) -> (Option<CompletedMarker>,
             let has_trailing_expression =
                 p.at_ts(EXPR_FIRST) && !(r.forbid_structs && p.at(T!['{']));
             if !has_trailing_expression {
-                if op == T![..=] {
-                    p.error("expected expression to end inclusive range");
-                }
                 // no RHS
                 lhs = m.complete(p, RANGE_EXPR);
                 break;
index 1f60a7aabd06f7ff40217458e3a30f4a8c5e5fea..6c171df8d5e323429e0bb6b7dd15c5d3ba986747 100644 (file)
@@ -83,6 +83,7 @@ pub enum SyntaxErrorKind {
     InvalidMatchInnerAttr,
     InvalidTupleIndexFormat,
     VisibilityNotAllowed,
+    InclusiveRangeMissingEnd,
 }
 
 impl fmt::Display for SyntaxErrorKind {
@@ -103,6 +104,9 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
             VisibilityNotAllowed => {
                 write!(f, "unnecessary visibility qualifier")
             }
+            InclusiveRangeMissingEnd => {
+                write!(f, "An inclusive range must have an end expression")
+            }
         }
     }
 }
index 2d596763ee376cabca113b93b61ed90bf011d934..e01333e23ce889239168e1a0e56830852e42203b 100644 (file)
@@ -103,6 +103,7 @@ pub(crate) fn validate(root: &SyntaxNode) -> Vec<SyntaxError> {
                 ast::FieldExpr(it) => { validate_numeric_name(it.name_ref(), &mut errors) },
                 ast::RecordField(it) => { validate_numeric_name(it.name_ref(), &mut errors) },
                 ast::Visibility(it) => { validate_visibility(it, &mut errors) },
+                ast::RangeExpr(it) => { validate_range_expr(it, &mut errors) },
                 _ => (),
             }
         }
@@ -227,3 +228,16 @@ fn validate_visibility(vis: ast::Visibility, errors: &mut Vec<SyntaxError>) {
             .push(SyntaxError::new(SyntaxErrorKind::VisibilityNotAllowed, vis.syntax.text_range()))
     }
 }
+
+fn validate_range_expr(expr: ast::RangeExpr, errors: &mut Vec<SyntaxError>) {
+    let last_child = match expr.syntax().last_child_or_token() {
+        Some(it) => it,
+        None => return,
+    };
+    if last_child.kind() == T![..=] {
+        errors.push(SyntaxError::new(
+            SyntaxErrorKind::InclusiveRangeMissingEnd,
+            last_child.text_range(),
+        ));
+    }
+}
index 3efe9816493b5ba4f9c276378e06031077809ff6..749d5360945310e03bfb76b6ce2c117a665223e6 100644 (file)
@@ -1,5 +1,5 @@
-SOURCE_FILE@[0; 24)
-  FN_DEF@[0; 23)
+SOURCE_FILE@[0; 33)
+  FN_DEF@[0; 32)
     FN_KW@[0; 2) "fn"
     WHITESPACE@[2; 3) " "
     NAME@[3; 7)
@@ -8,8 +8,8 @@ SOURCE_FILE@[0; 24)
       L_PAREN@[7; 8) "("
       R_PAREN@[8; 9) ")"
     WHITESPACE@[9; 10) " "
-    BLOCK_EXPR@[10; 23)
-      BLOCK@[10; 23)
+    BLOCK_EXPR@[10; 32)
+      BLOCK@[10; 32)
         L_CURLY@[10; 11) "{"
         WHITESPACE@[11; 16) "\n    "
         EXPR_STMT@[16; 21)
@@ -18,7 +18,13 @@ SOURCE_FILE@[0; 24)
               INT_NUMBER@[16; 17) "0"
             DOTDOTEQ@[17; 20) "..="
           SEMI@[20; 21) ";"
-        WHITESPACE@[21; 22) "\n"
-        R_CURLY@[22; 23) "}"
-  WHITESPACE@[23; 24) "\n"
-error 20: expected expression to end inclusive range
+        WHITESPACE@[21; 26) "\n    "
+        EXPR_STMT@[26; 30)
+          RANGE_EXPR@[26; 29)
+            DOTDOTEQ@[26; 29) "..="
+          SEMI@[29; 30) ";"
+        WHITESPACE@[30; 31) "\n"
+        R_CURLY@[31; 32) "}"
+  WHITESPACE@[32; 33) "\n"
+error [17; 20): An inclusive range must have an end expression
+error [26; 29): An inclusive range must have an end expression