Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/shortcuts.rs')
| -rw-r--r-- | crates/parser/src/shortcuts.rs | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/crates/parser/src/shortcuts.rs b/crates/parser/src/shortcuts.rs index 57005a6834..cc2b63d1e6 100644 --- a/crates/parser/src/shortcuts.rs +++ b/crates/parser/src/shortcuts.rs @@ -26,6 +26,7 @@ pub enum StrStep<'a> { impl LexedStr<'_> { pub fn to_input(&self) -> crate::Input { + let _p = tracing::span!(tracing::Level::INFO, "LexedStr::to_input").entered(); let mut res = crate::Input::default(); let mut was_joint = false; for i in 0..self.len() { @@ -189,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()); @@ -215,8 +216,22 @@ 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 }); + (self.sink)(StrStep::Exit); + + // move up + (self.sink)(StrStep::Exit); + + self.state = if has_pseudo_dot { State::Normal } else { State::PendingExit }; + } } + + self.pos += 1; } } |