From a68aefdc463af054e7e98293c06b751c135911d5 Mon Sep 17 00:00:00 2001 From: Geoffry Song Date: Fri, 15 Nov 2019 01:04:37 -0800 Subject: Move inclusive range check to validation --- crates/ra_parser/src/grammar/expressions.rs | 3 --- crates/ra_syntax/src/syntax_error.rs | 4 ++++ crates/ra_syntax/src/validation.rs | 14 ++++++++++++++ .../parser/err/0038_endless_inclusive_range.rs | 1 + .../parser/err/0038_endless_inclusive_range.txt | 22 ++++++++++++++-------- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs index cf69da25a..81d4f75f9 100644 --- a/crates/ra_parser/src/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs @@ -300,9 +300,6 @@ fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) -> (Option, 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; diff --git a/crates/ra_syntax/src/syntax_error.rs b/crates/ra_syntax/src/syntax_error.rs index 1f60a7aab..6c171df8d 100644 --- a/crates/ra_syntax/src/syntax_error.rs +++ b/crates/ra_syntax/src/syntax_error.rs @@ -83,6 +83,7 @@ pub enum SyntaxErrorKind { InvalidMatchInnerAttr, InvalidTupleIndexFormat, VisibilityNotAllowed, + InclusiveRangeMissingEnd, } impl fmt::Display for SyntaxErrorKind { @@ -103,6 +104,9 @@ impl fmt::Display for SyntaxErrorKind { VisibilityNotAllowed => { write!(f, "unnecessary visibility qualifier") } + InclusiveRangeMissingEnd => { + write!(f, "An inclusive range must have an end expression") + } } } } diff --git a/crates/ra_syntax/src/validation.rs b/crates/ra_syntax/src/validation.rs index 2d596763e..e01333e23 100644 --- a/crates/ra_syntax/src/validation.rs +++ b/crates/ra_syntax/src/validation.rs @@ -103,6 +103,7 @@ pub(crate) fn validate(root: &SyntaxNode) -> Vec { 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) { .push(SyntaxError::new(SyntaxErrorKind::VisibilityNotAllowed, vis.syntax.text_range())) } } + +fn validate_range_expr(expr: ast::RangeExpr, errors: &mut Vec) { + 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(), + )); + } +} diff --git a/crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.rs b/crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.rs index ecd25afaf..0b4ed7a2b 100644 --- a/crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.rs +++ b/crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.rs @@ -1,3 +1,4 @@ fn main() { 0..=; + ..=; } diff --git a/crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.txt b/crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.txt index 3efe98164..749d53609 100644 --- a/crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.txt +++ b/crates/ra_syntax/test_data/parser/err/0038_endless_inclusive_range.txt @@ -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 -- cgit v1.2.3