1
- use std:: ops:: Range ;
2
-
3
1
use diagnostics:: make_unclosed_delims_error;
4
2
use rustc_ast:: ast:: { self , AttrStyle } ;
5
3
use rustc_ast:: token:: { self , CommentKind , Delimiter , IdentIsRaw , Token , TokenKind } ;
@@ -10,7 +8,7 @@ use rustc_errors::{Applicability, Diag, DiagCtxtHandle, StashKey};
10
8
use rustc_lexer:: {
11
9
Base , Cursor , DocStyle , FrontmatterAllowed , LiteralKind , RawStrError , is_whitespace,
12
10
} ;
13
- use rustc_literal_escaper:: { EscapeError , Mode , unescape_mixed , unescape_unicode } ;
11
+ use rustc_literal_escaper:: { EscapeError , Mode , check_for_errors } ;
14
12
use rustc_session:: lint:: BuiltinLintDiag ;
15
13
use rustc_session:: lint:: builtin:: {
16
14
RUST_2021_PREFIXES_INCOMPATIBLE_SYNTAX , RUST_2024_GUARDED_STRING_INCOMPATIBLE_SYNTAX ,
@@ -702,7 +700,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
702
700
}
703
701
err. emit ( )
704
702
}
705
- self . cook_unicode ( token:: Char , Mode :: Char , start, end, 1 , 1 ) // ' '
703
+ self . cook_quoted ( token:: Char , Mode :: Char , start, end, 1 , 1 ) // ' '
706
704
}
707
705
rustc_lexer:: LiteralKind :: Byte { terminated } => {
708
706
if !terminated {
@@ -714,7 +712,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
714
712
. with_code ( E0763 )
715
713
. emit ( )
716
714
}
717
- self . cook_unicode ( token:: Byte , Mode :: Byte , start, end, 2 , 1 ) // b' '
715
+ self . cook_quoted ( token:: Byte , Mode :: Byte , start, end, 2 , 1 ) // b' '
718
716
}
719
717
rustc_lexer:: LiteralKind :: Str { terminated } => {
720
718
if !terminated {
@@ -726,7 +724,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
726
724
. with_code ( E0765 )
727
725
. emit ( )
728
726
}
729
- self . cook_unicode ( token:: Str , Mode :: Str , start, end, 1 , 1 ) // " "
727
+ self . cook_quoted ( token:: Str , Mode :: Str , start, end, 1 , 1 ) // " "
730
728
}
731
729
rustc_lexer:: LiteralKind :: ByteStr { terminated } => {
732
730
if !terminated {
@@ -738,7 +736,8 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
738
736
. with_code ( E0766 )
739
737
. emit ( )
740
738
}
741
- self . cook_unicode ( token:: ByteStr , Mode :: ByteStr , start, end, 2 , 1 ) // b" "
739
+ self . cook_quoted ( token:: ByteStr , Mode :: ByteStr , start, end, 2 , 1 )
740
+ // b" "
742
741
}
743
742
rustc_lexer:: LiteralKind :: CStr { terminated } => {
744
743
if !terminated {
@@ -750,13 +749,14 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
750
749
. with_code ( E0767 )
751
750
. emit ( )
752
751
}
753
- self . cook_mixed ( token:: CStr , Mode :: CStr , start, end, 2 , 1 ) // c" "
752
+ self . cook_quoted ( token:: CStr , Mode :: CStr , start, end, 2 , 1 ) // c" "
754
753
}
755
754
rustc_lexer:: LiteralKind :: RawStr { n_hashes } => {
756
755
if let Some ( n_hashes) = n_hashes {
757
756
let n = u32:: from ( n_hashes) ;
758
757
let kind = token:: StrRaw ( n_hashes) ;
759
- self . cook_unicode ( kind, Mode :: RawStr , start, end, 2 + n, 1 + n) // r##" "##
758
+ self . cook_quoted ( kind, Mode :: RawStr , start, end, 2 + n, 1 + n)
759
+ // r##" "##
760
760
} else {
761
761
self . report_raw_str_error ( start, 1 ) ;
762
762
}
@@ -765,7 +765,8 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
765
765
if let Some ( n_hashes) = n_hashes {
766
766
let n = u32:: from ( n_hashes) ;
767
767
let kind = token:: ByteStrRaw ( n_hashes) ;
768
- self . cook_unicode ( kind, Mode :: RawByteStr , start, end, 3 + n, 1 + n) // br##" "##
768
+ self . cook_quoted ( kind, Mode :: RawByteStr , start, end, 3 + n, 1 + n)
769
+ // br##" "##
769
770
} else {
770
771
self . report_raw_str_error ( start, 2 ) ;
771
772
}
@@ -774,7 +775,8 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
774
775
if let Some ( n_hashes) = n_hashes {
775
776
let n = u32:: from ( n_hashes) ;
776
777
let kind = token:: CStrRaw ( n_hashes) ;
777
- self . cook_unicode ( kind, Mode :: RawCStr , start, end, 3 + n, 1 + n) // cr##" "##
778
+ self . cook_quoted ( kind, Mode :: RawCStr , start, end, 3 + n, 1 + n)
779
+ // cr##" "##
778
780
} else {
779
781
self . report_raw_str_error ( start, 2 ) ;
780
782
}
@@ -1091,40 +1093,36 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
1091
1093
self . dcx ( ) . emit_fatal ( errors:: TooManyHashes { span : self . mk_sp ( start, self . pos ) , num } ) ;
1092
1094
}
1093
1095
1094
- fn cook_common (
1096
+ fn cook_quoted (
1095
1097
& self ,
1096
1098
mut kind : token:: LitKind ,
1097
1099
mode : Mode ,
1098
1100
start : BytePos ,
1099
1101
end : BytePos ,
1100
1102
prefix_len : u32 ,
1101
1103
postfix_len : u32 ,
1102
- unescape : fn ( & str , Mode , & mut dyn FnMut ( Range < usize > , Result < ( ) , EscapeError > ) ) ,
1103
1104
) -> ( token:: LitKind , Symbol ) {
1104
1105
let content_start = start + BytePos ( prefix_len) ;
1105
1106
let content_end = end - BytePos ( postfix_len) ;
1106
1107
let lit_content = self . str_from_to ( content_start, content_end) ;
1107
- unescape ( lit_content, mode, & mut |range, result| {
1108
- // Here we only check for errors. The actual unescaping is done later.
1109
- if let Err ( err) = result {
1110
- let span_with_quotes = self . mk_sp ( start, end) ;
1111
- let ( start, end) = ( range. start as u32 , range. end as u32 ) ;
1112
- let lo = content_start + BytePos ( start) ;
1113
- let hi = lo + BytePos ( end - start) ;
1114
- let span = self . mk_sp ( lo, hi) ;
1115
- let is_fatal = err. is_fatal ( ) ;
1116
- if let Some ( guar) = emit_unescape_error (
1117
- self . dcx ( ) ,
1118
- lit_content,
1119
- span_with_quotes,
1120
- span,
1121
- mode,
1122
- range,
1123
- err,
1124
- ) {
1125
- assert ! ( is_fatal) ;
1126
- kind = token:: Err ( guar) ;
1127
- }
1108
+ check_for_errors ( lit_content, mode, |range, err| {
1109
+ let span_with_quotes = self . mk_sp ( start, end) ;
1110
+ let ( start, end) = ( range. start as u32 , range. end as u32 ) ;
1111
+ let lo = content_start + BytePos ( start) ;
1112
+ let hi = lo + BytePos ( end - start) ;
1113
+ let span = self . mk_sp ( lo, hi) ;
1114
+ let is_fatal = err. is_fatal ( ) ;
1115
+ if let Some ( guar) = emit_unescape_error (
1116
+ self . dcx ( ) ,
1117
+ lit_content,
1118
+ span_with_quotes,
1119
+ span,
1120
+ mode,
1121
+ range,
1122
+ err,
1123
+ ) {
1124
+ assert ! ( is_fatal) ;
1125
+ kind = token:: Err ( guar) ;
1128
1126
}
1129
1127
} ) ;
1130
1128
@@ -1137,34 +1135,6 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
1137
1135
} ;
1138
1136
( kind, sym)
1139
1137
}
1140
-
1141
- fn cook_unicode (
1142
- & self ,
1143
- kind : token:: LitKind ,
1144
- mode : Mode ,
1145
- start : BytePos ,
1146
- end : BytePos ,
1147
- prefix_len : u32 ,
1148
- postfix_len : u32 ,
1149
- ) -> ( token:: LitKind , Symbol ) {
1150
- self . cook_common ( kind, mode, start, end, prefix_len, postfix_len, |src, mode, callback| {
1151
- unescape_unicode ( src, mode, & mut |span, result| callback ( span, result. map ( drop) ) )
1152
- } )
1153
- }
1154
-
1155
- fn cook_mixed (
1156
- & self ,
1157
- kind : token:: LitKind ,
1158
- mode : Mode ,
1159
- start : BytePos ,
1160
- end : BytePos ,
1161
- prefix_len : u32 ,
1162
- postfix_len : u32 ,
1163
- ) -> ( token:: LitKind , Symbol ) {
1164
- self . cook_common ( kind, mode, start, end, prefix_len, postfix_len, |src, mode, callback| {
1165
- unescape_mixed ( src, mode, & mut |span, result| callback ( span, result. map ( drop) ) )
1166
- } )
1167
- }
1168
1138
}
1169
1139
1170
1140
pub fn nfc_normalize ( string : & str ) -> Symbol {
0 commit comments