@@ -85,14 +85,16 @@ where
85
85
match mode {
86
86
Mode :: Char | Mode :: Byte => {
87
87
let mut chars = src. chars ( ) ;
88
- let result = unescape_char_or_byte ( & mut chars, mode) ;
88
+ let result = unescape_char_or_byte ( & mut chars, mode == Mode :: Byte ) ;
89
89
// The Chars iterator moved forward.
90
90
callback ( 0 ..( src. len ( ) - chars. as_str ( ) . len ( ) ) , result) ;
91
91
}
92
- Mode :: Str | Mode :: ByteStr => unescape_str_or_byte_str ( src, mode, callback) ,
92
+ Mode :: Str | Mode :: ByteStr => unescape_str_or_byte_str ( src, mode == Mode :: ByteStr , callback) ,
93
93
// NOTE: Raw strings do not perform any explicit character escaping, here we
94
94
// only translate CRLF to LF and produce errors on bare CR.
95
- Mode :: RawStr | Mode :: RawByteStr => unescape_raw_str_or_raw_byte_str ( src, mode, callback) ,
95
+ Mode :: RawStr | Mode :: RawByteStr => {
96
+ unescape_raw_str_or_raw_byte_str ( src, mode == Mode :: RawByteStr , callback)
97
+ }
96
98
}
97
99
}
98
100
@@ -103,7 +105,7 @@ pub fn unescape_byte_literal<F>(src: &str, mode: Mode, callback: &mut F)
103
105
where
104
106
F : FnMut ( Range < usize > , Result < u8 , EscapeError > ) ,
105
107
{
106
- debug_assert ! ( mode. is_bytes ( ) ) ;
108
+ debug_assert ! ( mode. is_byte ( ) ) ;
107
109
unescape_literal ( src, mode, & mut |range, result| {
108
110
callback ( range, result. map ( byte_from_char) ) ;
109
111
} )
@@ -113,15 +115,14 @@ where
113
115
/// unescaped char or an error
114
116
pub fn unescape_char ( src : & str ) -> Result < char , ( usize , EscapeError ) > {
115
117
let mut chars = src. chars ( ) ;
116
- unescape_char_or_byte ( & mut chars, Mode :: Char )
117
- . map_err ( |err| ( src. len ( ) - chars. as_str ( ) . len ( ) , err) )
118
+ unescape_char_or_byte ( & mut chars, false ) . map_err ( |err| ( src. len ( ) - chars. as_str ( ) . len ( ) , err) )
118
119
}
119
120
120
121
/// Takes a contents of a byte literal (without quotes), and returns an
121
122
/// unescaped byte or an error.
122
123
pub fn unescape_byte ( src : & str ) -> Result < u8 , ( usize , EscapeError ) > {
123
124
let mut chars = src. chars ( ) ;
124
- unescape_char_or_byte ( & mut chars, Mode :: Byte )
125
+ unescape_char_or_byte ( & mut chars, true )
125
126
. map ( byte_from_char)
126
127
. map_err ( |err| ( src. len ( ) - chars. as_str ( ) . len ( ) , err) )
127
128
}
@@ -145,15 +146,15 @@ impl Mode {
145
146
}
146
147
}
147
148
148
- pub fn is_bytes ( self ) -> bool {
149
+ pub fn is_byte ( self ) -> bool {
149
150
match self {
150
151
Mode :: Byte | Mode :: ByteStr | Mode :: RawByteStr => true ,
151
152
Mode :: Char | Mode :: Str | Mode :: RawStr => false ,
152
153
}
153
154
}
154
155
}
155
156
156
- fn scan_escape ( chars : & mut Chars < ' _ > , mode : Mode ) -> Result < char , EscapeError > {
157
+ fn scan_escape ( chars : & mut Chars < ' _ > , is_byte : bool ) -> Result < char , EscapeError > {
157
158
// Previous character was '\\', unescape what follows.
158
159
let res = match chars. next ( ) . ok_or ( EscapeError :: LoneSlash ) ? {
159
160
'"' => '"' ,
@@ -176,7 +177,7 @@ fn scan_escape(chars: &mut Chars<'_>, mode: Mode) -> Result<char, EscapeError> {
176
177
let value = hi * 16 + lo;
177
178
178
179
// For a non-byte literal verify that it is within ASCII range.
179
- if !mode . is_bytes ( ) && !is_ascii ( value) {
180
+ if !is_byte && !is_ascii ( value) {
180
181
return Err ( EscapeError :: OutOfRangeHexEscape ) ;
181
182
}
182
183
let value = value as u8 ;
@@ -212,7 +213,7 @@ fn scan_escape(chars: &mut Chars<'_>, mode: Mode) -> Result<char, EscapeError> {
212
213
213
214
// Incorrect syntax has higher priority for error reporting
214
215
// than unallowed value for a literal.
215
- if mode . is_bytes ( ) {
216
+ if is_byte {
216
217
return Err ( EscapeError :: UnicodeEscapeInByte ) ;
217
218
}
218
219
@@ -244,23 +245,22 @@ fn scan_escape(chars: &mut Chars<'_>, mode: Mode) -> Result<char, EscapeError> {
244
245
}
245
246
246
247
#[ inline]
247
- fn ascii_check ( c : char , mode : Mode ) -> Result < char , EscapeError > {
248
- if mode . is_bytes ( ) && !c. is_ascii ( ) {
248
+ fn ascii_check ( c : char , is_byte : bool ) -> Result < char , EscapeError > {
249
+ if is_byte && !c. is_ascii ( ) {
249
250
// Byte literal can't be a non-ascii character.
250
251
Err ( EscapeError :: NonAsciiCharInByte )
251
252
} else {
252
253
Ok ( c)
253
254
}
254
255
}
255
256
256
- fn unescape_char_or_byte ( chars : & mut Chars < ' _ > , mode : Mode ) -> Result < char , EscapeError > {
257
- debug_assert ! ( mode == Mode :: Char || mode == Mode :: Byte ) ;
257
+ fn unescape_char_or_byte ( chars : & mut Chars < ' _ > , is_byte : bool ) -> Result < char , EscapeError > {
258
258
let c = chars. next ( ) . ok_or ( EscapeError :: ZeroChars ) ?;
259
259
let res = match c {
260
- '\\' => scan_escape ( chars, mode ) ,
260
+ '\\' => scan_escape ( chars, is_byte ) ,
261
261
'\n' | '\t' | '\'' => Err ( EscapeError :: EscapeOnlyChar ) ,
262
262
'\r' => Err ( EscapeError :: BareCarriageReturn ) ,
263
- _ => ascii_check ( c, mode ) ,
263
+ _ => ascii_check ( c, is_byte ) ,
264
264
} ?;
265
265
if chars. next ( ) . is_some ( ) {
266
266
return Err ( EscapeError :: MoreThanOneChar ) ;
@@ -270,11 +270,10 @@ fn unescape_char_or_byte(chars: &mut Chars<'_>, mode: Mode) -> Result<char, Esca
270
270
271
271
/// Takes a contents of a string literal (without quotes) and produces a
272
272
/// sequence of escaped characters or errors.
273
- fn unescape_str_or_byte_str < F > ( src : & str , mode : Mode , callback : & mut F )
273
+ fn unescape_str_or_byte_str < F > ( src : & str , is_byte : bool , callback : & mut F )
274
274
where
275
275
F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
276
276
{
277
- debug_assert ! ( mode == Mode :: Str || mode == Mode :: ByteStr ) ;
278
277
let mut chars = src. chars ( ) ;
279
278
280
279
// The `start` and `end` computation here is complicated because
@@ -293,14 +292,14 @@ where
293
292
skip_ascii_whitespace ( & mut chars, start, callback) ;
294
293
continue ;
295
294
}
296
- _ => scan_escape ( & mut chars, mode ) ,
295
+ _ => scan_escape ( & mut chars, is_byte ) ,
297
296
}
298
297
}
299
298
'\n' => Ok ( '\n' ) ,
300
299
'\t' => Ok ( '\t' ) ,
301
300
'"' => Err ( EscapeError :: EscapeOnlyChar ) ,
302
301
'\r' => Err ( EscapeError :: BareCarriageReturn ) ,
303
- _ => ascii_check ( c, mode ) ,
302
+ _ => ascii_check ( c, is_byte ) ,
304
303
} ;
305
304
let end = src. len ( ) - chars. as_str ( ) . len ( ) ;
306
305
callback ( start..end, result) ;
@@ -337,11 +336,10 @@ where
337
336
/// sequence of characters or errors.
338
337
/// NOTE: Raw strings do not perform any explicit character escaping, here we
339
338
/// only translate CRLF to LF and produce errors on bare CR.
340
- fn unescape_raw_str_or_raw_byte_str < F > ( src : & str , mode : Mode , callback : & mut F )
339
+ fn unescape_raw_str_or_raw_byte_str < F > ( src : & str , is_byte : bool , callback : & mut F )
341
340
where
342
341
F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
343
342
{
344
- debug_assert ! ( mode == Mode :: RawStr || mode == Mode :: RawByteStr ) ;
345
343
let mut chars = src. chars ( ) ;
346
344
347
345
// The `start` and `end` computation here matches the one in
@@ -351,7 +349,7 @@ where
351
349
let start = src. len ( ) - chars. as_str ( ) . len ( ) - c. len_utf8 ( ) ;
352
350
let result = match c {
353
351
'\r' => Err ( EscapeError :: BareCarriageReturnInRawString ) ,
354
- c if mode . is_bytes ( ) && !c. is_ascii ( ) => Err ( EscapeError :: NonAsciiCharInByteString ) ,
352
+ c if is_byte && !c. is_ascii ( ) => Err ( EscapeError :: NonAsciiCharInByteString ) ,
355
353
c => Ok ( c) ,
356
354
} ;
357
355
let end = src. len ( ) - chars. as_str ( ) . len ( ) ;
0 commit comments