Skip to content

Commit c16075a

Browse files
committed
feat: hint at unterminated strings in unknown prefix errors
When encountering 'unknown literal prefix' errors, check for unbalanced quotes in recent code and suggest checking for unterminated string literals.
1 parent 4e147e7 commit c16075a

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

.claude/settings.local.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"permissions": {
3+
"allow": [
4+
"mcp__sequential-thinking__sequentialthinking"
5+
],
6+
"deny": []
7+
}
8+
}

crates/parser/src/lexed_str.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,13 @@ impl<'a> Converter<'a> {
149149
}
150150
}
151151

152+
/// Simple check for recent unterminated string literal
153+
fn has_recent_unterminated_string(&self) -> bool {
154+
let start = self.offset.saturating_sub(500);
155+
let recent_text = &self.res.text[start..self.offset];
156+
recent_text.chars().filter(|&c| c == '"').count() % 2 == 1
157+
}
158+
152159
fn finalize_with_eof(mut self) -> LexedStr<'a> {
153160
self.res.push(EOF, self.offset);
154161
self.res
@@ -267,7 +274,15 @@ impl<'a> Converter<'a> {
267274
rustc_lexer::TokenKind::Unknown => ERROR,
268275
rustc_lexer::TokenKind::UnknownPrefix if token_text == "builtin" => IDENT,
269276
rustc_lexer::TokenKind::UnknownPrefix => {
270-
errors.push("unknown literal prefix".into());
277+
let error_msg = if self.has_recent_unterminated_string() {
278+
format!(
279+
"unknown literal prefix `{}` (note: check for unterminated string literal)",
280+
token_text
281+
)
282+
} else {
283+
"unknown literal prefix".into()
284+
};
285+
errors.push(error_msg);
271286
IDENT
272287
}
273288
rustc_lexer::TokenKind::Eof => EOF,

0 commit comments

Comments
 (0)