Disallow any keyword followed by an exclaimation mark

This commit is contained in:
Joshua Warner 2024-12-28 22:15:03 -05:00
parent 0acd59b4d6
commit 9e6c249dca
No known key found for this signature in database
GPG key ID: 89AD497003F93FDD
13 changed files with 23 additions and 83 deletions

View file

@ -1,4 +1,5 @@
use crate::ast::TryTarget;
use crate::keyword::is_allowed_identifier;
use crate::parser::Progress::{self, *};
use crate::parser::{BadInputError, EExpr, ParseResult, Parser};
use crate::state::State;
@ -60,7 +61,7 @@ pub fn lowercase_ident<'a>() -> impl Parser<'a, &'a str, ()> {
move |_, state: State<'a>, _min_indent: u32| match chomp_lowercase_part(state.bytes()) {
Err(progress) => Err((progress, ())),
Ok(ident) => {
if crate::keyword::KEYWORDS.iter().any(|kw| &ident == kw) {
if !is_allowed_identifier(&ident) {
Err((NoProgress, ()))
} else {
let width = ident.len();
@ -87,7 +88,7 @@ pub fn lowercase_ident_keyword_e<'a>() -> impl Parser<'a, &'a str, ()> {
move |_, state: State<'a>, _min_indent: u32| match chomp_lowercase_part(state.bytes()) {
Err(progress) => Err((progress, ())),
Ok(ident) => {
if crate::keyword::KEYWORDS.iter().any(|kw| &ident == kw) {
if !is_allowed_identifier(&ident) {
Err((MadeProgress, ()))
} else {
let width = ident.len();
@ -137,7 +138,7 @@ pub fn unqualified_ident<'a>() -> impl Parser<'a, &'a str, ()> {
move |_, state: State<'a>, _min_indent: u32| match chomp_anycase_part(state.bytes()) {
Err(progress) => Err((progress, ())),
Ok(ident) => {
if crate::keyword::KEYWORDS.iter().any(|kw| &ident == kw) {
if !is_allowed_identifier(&ident) {
Err((MadeProgress, ()))
} else {
let width = ident.len();
@ -166,8 +167,8 @@ pub fn parse_ident<'a>(
if let Ident::Access { module_name, parts } = ident {
if module_name.is_empty() {
if let Some(first) = parts.first() {
for keyword in crate::keyword::KEYWORDS.iter() {
if first == &Accessor::RecordField(keyword) {
if let Accessor::RecordField(ident) = first {
if !is_allowed_identifier(ident) {
return Err((NoProgress, EExpr::Start(initial.pos())));
}
}

View file

@ -21,7 +21,13 @@ pub const WHERE: &str = "where";
// These keywords are valid in headers
pub const PLATFORM: &str = "platform";
pub const KEYWORDS: [&str; 12] = [
pub const KEYWORDS: [&str; 11] = [
IF, THEN, ELSE, WHEN, AS, IS, DBG, IMPORT, EXPECT, RETURN, CRASH,
"expect!", // not itself a keyword, but it's problematic if we allow an identifier like this!
];
pub fn is_allowed_identifier(mut ident: &str) -> bool {
if ident.ends_with('!') {
ident = &ident[..ident.len() - 1];
}
!crate::keyword::KEYWORDS.iter().any(|kw| &ident == kw)
}