@@ -274,7 +274,7 @@ impl<'a> Converter<'a> {
274
274
let text = & self . res . text [ self . offset + 2 ..] [ ..len - 2 ] ;
275
275
let i = text. rfind ( '\'' ) . unwrap ( ) ;
276
276
let text = & text[ ..i] ;
277
- if let Err ( e) = rustc_lexer:: unescape:: unescape_char ( text) {
277
+ if let Err ( e) = rustc_lexer:: unescape:: unescape_byte ( text) {
278
278
err = error_to_diagnostic_message ( e, Mode :: Byte ) ;
279
279
}
280
280
}
@@ -284,18 +284,33 @@ impl<'a> Converter<'a> {
284
284
rustc_lexer:: LiteralKind :: Str { terminated } => {
285
285
if !terminated {
286
286
err = "Missing trailing `\" ` symbol to terminate the string literal" ;
287
+ } else {
288
+ let text = & self . res . text [ self . offset + 1 ..] [ ..len - 1 ] ;
289
+ let i = text. rfind ( '"' ) . unwrap ( ) ;
290
+ let text = & text[ ..i] ;
291
+ err = unescape_string_error_message ( text, Mode :: Str ) ;
287
292
}
288
293
STRING
289
294
}
290
295
rustc_lexer:: LiteralKind :: ByteStr { terminated } => {
291
296
if !terminated {
292
297
err = "Missing trailing `\" ` symbol to terminate the byte string literal" ;
298
+ } else {
299
+ let text = & self . res . text [ self . offset + 2 ..] [ ..len - 2 ] ;
300
+ let i = text. rfind ( '"' ) . unwrap ( ) ;
301
+ let text = & text[ ..i] ;
302
+ err = unescape_string_error_message ( text, Mode :: ByteStr ) ;
293
303
}
294
304
BYTE_STRING
295
305
}
296
306
rustc_lexer:: LiteralKind :: CStr { terminated } => {
297
307
if !terminated {
298
308
err = "Missing trailing `\" ` symbol to terminate the string literal" ;
309
+ } else {
310
+ let text = & self . res . text [ self . offset + 2 ..] [ ..len - 2 ] ;
311
+ let i = text. rfind ( '"' ) . unwrap ( ) ;
312
+ let text = & text[ ..i] ;
313
+ err = unescape_string_error_message ( text, Mode :: CStr ) ;
299
314
}
300
315
C_STRING
301
316
}
@@ -360,3 +375,27 @@ fn error_to_diagnostic_message(error: EscapeError, mode: Mode) -> &'static str {
360
375
EscapeError :: MultipleSkippedLinesWarning => "" ,
361
376
}
362
377
}
378
+
379
+ fn unescape_string_error_message ( text : & str , mode : Mode ) -> & ' static str {
380
+ let mut error_message = "" ;
381
+ match mode {
382
+ Mode :: CStr => {
383
+ rustc_lexer:: unescape:: unescape_c_string ( text, mode, & mut |_, res| {
384
+ if let Err ( e) = res {
385
+ error_message = error_to_diagnostic_message ( e, mode) ;
386
+ }
387
+ } ) ;
388
+ }
389
+ Mode :: ByteStr | Mode :: Str => {
390
+ rustc_lexer:: unescape:: unescape_literal ( text, mode, & mut |_, res| {
391
+ if let Err ( e) = res {
392
+ error_message = error_to_diagnostic_message ( e, mode) ;
393
+ }
394
+ } ) ;
395
+ }
396
+ _ => {
397
+ // Other Modes are not supported yet or do not apply
398
+ }
399
+ }
400
+ error_message
401
+ }
0 commit comments