diff --git a/crates/parser/src/lexed_str.rs b/crates/parser/src/lexed_str.rs index 8fff1c3db748..07774f3c74bb 100644 --- a/crates/parser/src/lexed_str.rs +++ b/crates/parser/src/lexed_str.rs @@ -149,6 +149,13 @@ impl<'a> Converter<'a> { } } + /// Simple check for recent unterminated string literal + fn has_recent_unterminated_string(&self) -> bool { + let start = self.offset.saturating_sub(500); + let recent_text = &self.res.text[start..self.offset]; + recent_text.chars().filter(|&c| c == '"').count() % 2 == 1 + } + fn finalize_with_eof(mut self) -> LexedStr<'a> { self.res.push(EOF, self.offset); self.res @@ -267,7 +274,15 @@ impl<'a> Converter<'a> { rustc_lexer::TokenKind::Unknown => ERROR, rustc_lexer::TokenKind::UnknownPrefix if token_text == "builtin" => IDENT, rustc_lexer::TokenKind::UnknownPrefix => { - errors.push("unknown literal prefix".into()); + let error_msg = if self.has_recent_unterminated_string() { + format!( + "unknown literal prefix `{}` (note: check for unterminated string literal)", + token_text + ) + } else { + "unknown literal prefix".into() + }; + errors.push(error_msg); IDENT } rustc_lexer::TokenKind::Eof => EOF,