From e50189cfa75d83ea1b74b1dc2cf1fc9c01f8c825 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 14 Mar 2023 22:31:05 +0100 Subject: [PATCH] Allow keywords as fields --- src/syntax/lexer.rs | 19 +++++++++++++------ tests/typ/compiler/field.typ | 3 +-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/syntax/lexer.rs b/src/syntax/lexer.rs index 2d5559177..919cce69b 100644 --- a/src/syntax/lexer.rs +++ b/src/syntax/lexer.rs @@ -479,13 +479,16 @@ impl Lexer<'_> { fn ident(&mut self, start: usize) -> SyntaxKind { self.s.eat_while(is_id_continue); - match self.s.from(start) { - "none" => SyntaxKind::None, - "auto" => SyntaxKind::Auto, - "true" => SyntaxKind::Bool, - "false" => SyntaxKind::Bool, - id => keyword(id).unwrap_or(SyntaxKind::Ident), + let ident = self.s.from(start); + + let prev = self.s.get(0..start); + if !prev.ends_with(['.', '@']) || prev.ends_with("..") { + if let Some(keyword) = keyword(ident) { + return keyword; + } } + + SyntaxKind::Ident } fn number(&mut self, start: usize, c: char) -> SyntaxKind { @@ -556,6 +559,10 @@ impl Lexer<'_> { /// Try to parse an identifier into a keyword. fn keyword(ident: &str) -> Option { Some(match ident { + "none" => SyntaxKind::None, + "auto" => SyntaxKind::Auto, + "true" => SyntaxKind::Bool, + "false" => SyntaxKind::Bool, "not" => SyntaxKind::Not, "and" => SyntaxKind::And, "or" => SyntaxKind::Or, diff --git a/tests/typ/compiler/field.typ b/tests/typ/compiler/field.typ index 342ae75bb..49ffca04a 100644 --- a/tests/typ/compiler/field.typ +++ b/tests/typ/compiler/field.typ @@ -36,6 +36,5 @@ = A --- -// Error: 9 expected identifier -// Error: 9 expected semicolon or line break +// Error: 9-13 cannot access fields on type boolean #{false.true}