From 70d43c3faf6cc4e6fe4833c6375d05e54874ca0d Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 24 Jan 2021 02:17:41 +0100 Subject: Add validation for mutable const items --- crates/syntax/src/validation.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'crates/syntax/src') diff --git a/crates/syntax/src/validation.rs b/crates/syntax/src/validation.rs index 7694e8834..3e216fb70 100644 --- a/crates/syntax/src/validation.rs +++ b/crates/syntax/src/validation.rs @@ -1,4 +1,6 @@ -//! FIXME: write short doc here +//! This module implements syntax validation that the parser doesn't handle. +//! +//! A failed validation emits a diagnostic. mod block; @@ -92,6 +94,7 @@ pub(crate) fn validate(root: &SyntaxNode) -> Vec { match_ast! { match node { ast::Literal(it) => validate_literal(it, &mut errors), + ast::Const(it) => validate_const(it, &mut errors), ast::BlockExpr(it) => block::validate_block_expr(it, &mut errors), ast::FieldExpr(it) => validate_numeric_name(it.name_ref(), &mut errors), ast::RecordExprField(it) => validate_numeric_name(it.name_ref(), &mut errors), @@ -362,3 +365,14 @@ fn validate_macro_rules(mac: ast::MacroRules, errors: &mut Vec) { )); } } + +fn validate_const(const_: ast::Const, errors: &mut Vec) { + if let Some(mut_token) = const_ + .const_token() + .and_then(|t| t.next_token()) + .and_then(|t| algo::skip_trivia_token(t, Direction::Next)) + .filter(|t| t.kind() == T![mut]) + { + errors.push(SyntaxError::new("const globals cannot be mutable", mut_token.text_range())); + } +} -- cgit v1.2.3