From 03420c330eae38c36ecf5adf82d6b89cc6e94cb8 Mon Sep 17 00:00:00 2001 From: roife Date: Wed, 6 Mar 2024 22:50:29 +0800 Subject: [PATCH] fix: panic when split float numbers in scientific notation --- crates/parser/src/shortcuts.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/crates/parser/src/shortcuts.rs b/crates/parser/src/shortcuts.rs index 680a70997d4..2beb3c3ef0d 100644 --- a/crates/parser/src/shortcuts.rs +++ b/crates/parser/src/shortcuts.rs @@ -190,7 +190,7 @@ impl Builder<'_, '_> { fn do_float_split(&mut self, has_pseudo_dot: bool) { let text = &self.lexed.range_text(self.pos..self.pos + 1); - self.pos += 1; + match text.split_once('.') { Some((left, right)) => { assert!(!left.is_empty()); @@ -216,8 +216,26 @@ impl Builder<'_, '_> { self.state = State::PendingExit; } } - None => unreachable!(), + None => { + // illegal float literal which doesn't have dot in form (like 1e0) + // we should emit an error node here + (self.sink)(StrStep::Error { msg: "illegal float literal", pos: self.pos }); + (self.sink)(StrStep::Enter { kind: SyntaxKind::ERROR }); + (self.sink)(StrStep::Token { kind: SyntaxKind::FLOAT_NUMBER, text: text }); + (self.sink)(StrStep::Exit); + + // move up + (self.sink)(StrStep::Exit); + + self.state = if has_pseudo_dot { + State::Normal + } else { + State::PendingExit + }; + } } + + self.pos += 1; } }