@@ -274,7 +274,7 @@ impl<'a> Converter<'a> {
274274 let text = & self . res . text [ self . offset + 2 ..] [ ..len - 2 ] ;
275275 let i = text. rfind ( '\'' ) . unwrap ( ) ;
276276 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) {
278278 err = error_to_diagnostic_message ( e, Mode :: Byte ) ;
279279 }
280280 }
@@ -284,18 +284,33 @@ impl<'a> Converter<'a> {
284284 rustc_lexer:: LiteralKind :: Str { terminated } => {
285285 if !terminated {
286286 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 ) ;
287292 }
288293 STRING
289294 }
290295 rustc_lexer:: LiteralKind :: ByteStr { terminated } => {
291296 if !terminated {
292297 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 ) ;
293303 }
294304 BYTE_STRING
295305 }
296306 rustc_lexer:: LiteralKind :: CStr { terminated } => {
297307 if !terminated {
298308 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 ) ;
299314 }
300315 C_STRING
301316 }
@@ -360,3 +375,27 @@ fn error_to_diagnostic_message(error: EscapeError, mode: Mode) -> &'static str {
360375 EscapeError :: MultipleSkippedLinesWarning => "" ,
361376 }
362377}
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