@@ -149,6 +149,48 @@ impl<'a> Converter<'a> {
149
149
}
150
150
}
151
151
152
+ /// Check for likely unterminated string by analyzing STRING token content
153
+ fn has_likely_unterminated_string ( & self ) -> bool {
154
+ // Look at the most recent STRING token content
155
+ if let Some ( last_token_idx) = self . res . kind . len ( ) . checked_sub ( 1 ) {
156
+ if self . res . kind [ last_token_idx] == STRING {
157
+ let start = self . res . start [ last_token_idx] as usize ;
158
+ let content = & self . res . text [ start..self . offset ] ;
159
+
160
+ // Check for obvious code patterns in string content
161
+ let has_code_patterns = content. contains ( '(' )
162
+ && (
163
+ content. contains ( "//" ) || // Comments in strings = suspicious
164
+ content. contains ( ";\n " )
165
+ // Statements in strings = suspicious
166
+ ) ;
167
+
168
+ return has_code_patterns;
169
+ } else {
170
+ // Look for any STRING token in recent history
171
+ for i in ( 0 ..=last_token_idx) . rev ( ) . take ( 5 ) {
172
+ if self . res . kind [ i] == STRING {
173
+ let start = self . res . start [ i] as usize ;
174
+ let end = if i + 1 < self . res . start . len ( ) {
175
+ self . res . start [ i + 1 ] as usize
176
+ } else {
177
+ self . offset
178
+ } ;
179
+ let content = & self . res . text [ start..end] ;
180
+
181
+ let has_code_patterns = content. contains ( '(' )
182
+ && ( content. contains ( "//" ) || content. contains ( ";\n " ) ) ;
183
+
184
+ if has_code_patterns {
185
+ return true ;
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ false
192
+ }
193
+
152
194
fn finalize_with_eof ( mut self ) -> LexedStr < ' a > {
153
195
self . res . push ( EOF , self . offset ) ;
154
196
self . res
@@ -267,7 +309,17 @@ impl<'a> Converter<'a> {
267
309
rustc_lexer:: TokenKind :: Unknown => ERROR ,
268
310
rustc_lexer:: TokenKind :: UnknownPrefix if token_text == "builtin" => IDENT ,
269
311
rustc_lexer:: TokenKind :: UnknownPrefix => {
270
- errors. push ( "unknown literal prefix" . into ( ) ) ;
312
+ let has_unterminated = self . has_likely_unterminated_string ( ) ;
313
+
314
+ let error_msg = if has_unterminated {
315
+ format ! (
316
+ "unknown literal prefix `{}` (note: check for unterminated string literal)" ,
317
+ token_text
318
+ )
319
+ } else {
320
+ "unknown literal prefix" . to_string ( )
321
+ } ;
322
+ errors. push ( error_msg) ;
271
323
IDENT
272
324
}
273
325
rustc_lexer:: TokenKind :: Eof => EOF ,
0 commit comments