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.rs19
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;
}
}