Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/lexed_str.rs')
| -rw-r--r-- | crates/parser/src/lexed_str.rs | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/crates/parser/src/lexed_str.rs b/crates/parser/src/lexed_str.rs index f4b9988eac..fae5d8884b 100644 --- a/crates/parser/src/lexed_str.rs +++ b/crates/parser/src/lexed_str.rs @@ -177,7 +177,7 @@ impl<'a> Converter<'a> { rustc_lexer::TokenKind::RawIdent => IDENT, rustc_lexer::TokenKind::Literal { kind, .. } => { - self.extend_literal(token_text.len(), kind); + self.extend_literal(token_text, kind); return; } @@ -223,7 +223,7 @@ impl<'a> Converter<'a> { self.push(syntax_kind, token_text.len(), err); } - fn extend_literal(&mut self, len: usize, kind: &rustc_lexer::LiteralKind) { + fn extend_literal(&mut self, token_text: &str, kind: &rustc_lexer::LiteralKind) { let mut err = ""; let syntax_kind = match *kind { @@ -237,7 +237,22 @@ impl<'a> Converter<'a> { if empty_exponent { err = "Missing digits after the exponent symbol"; } - FLOAT_NUMBER + + // In order to correctly parse nested tuple accesses like `tup.0.0`, where the `0.0` + // is lexed as a float, we split floats that contain a `.` into 3 tokens. + if let Some((before, after)) = token_text.split_once('.') { + let err = if err.is_empty() { None } else { Some(err) }; + if !before.is_empty() { + self.push(FLOAT_NUMBER_PART, before.len(), None); + } + self.push(DOT, 1, None); + if !after.is_empty() { + self.push(FLOAT_NUMBER_PART, after.len(), err); + } + return; + } + + FLOAT_NUMBER_PART } rustc_lexer::LiteralKind::Char { terminated } => { if !terminated { @@ -295,6 +310,6 @@ impl<'a> Converter<'a> { }; let err = if err.is_empty() { None } else { Some(err) }; - self.push(syntax_kind, len, err); + self.push(syntax_kind, token_text.len(), err); } } |