@@ -85,14 +85,16 @@ where
8585 match mode {
8686 Mode :: Char | Mode :: Byte => {
8787 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 ) ;
8989 // The Chars iterator moved forward.
9090 callback ( 0 ..( src. len ( ) - chars. as_str ( ) . len ( ) ) , result) ;
9191 }
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) ,
9393 // NOTE: Raw strings do not perform any explicit character escaping, here we
9494 // 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+ }
9698 }
9799}
98100
@@ -103,7 +105,7 @@ pub fn unescape_byte_literal<F>(src: &str, mode: Mode, callback: &mut F)
103105where
104106 F : FnMut ( Range < usize > , Result < u8 , EscapeError > ) ,
105107{
106- debug_assert ! ( mode. is_bytes ( ) ) ;
108+ debug_assert ! ( mode. is_byte ( ) ) ;
107109 unescape_literal ( src, mode, & mut |range, result| {
108110 callback ( range, result. map ( byte_from_char) ) ;
109111 } )
@@ -113,15 +115,14 @@ where
113115/// unescaped char or an error
114116pub fn unescape_char ( src : & str ) -> Result < char , ( usize , EscapeError ) > {
115117 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) )
118119}
119120
120121/// Takes a contents of a byte literal (without quotes), and returns an
121122/// unescaped byte or an error.
122123pub fn unescape_byte ( src : & str ) -> Result < u8 , ( usize , EscapeError ) > {
123124 let mut chars = src. chars ( ) ;
124- unescape_char_or_byte ( & mut chars, Mode :: Byte )
125+ unescape_char_or_byte ( & mut chars, true )
125126 . map ( byte_from_char)
126127 . map_err ( |err| ( src. len ( ) - chars. as_str ( ) . len ( ) , err) )
127128}
@@ -145,15 +146,15 @@ impl Mode {
145146 }
146147 }
147148
148- pub fn is_bytes ( self ) -> bool {
149+ pub fn is_byte ( self ) -> bool {
149150 match self {
150151 Mode :: Byte | Mode :: ByteStr | Mode :: RawByteStr => true ,
151152 Mode :: Char | Mode :: Str | Mode :: RawStr => false ,
152153 }
153154 }
154155}
155156
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 > {
157158 // Previous character was '\\', unescape what follows.
158159 let res = match chars. next ( ) . ok_or ( EscapeError :: LoneSlash ) ? {
159160 '"' => '"' ,
@@ -176,7 +177,7 @@ fn scan_escape(chars: &mut Chars<'_>, mode: Mode) -> Result<char, EscapeError> {
176177 let value = hi * 16 + lo;
177178
178179 // 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) {
180181 return Err ( EscapeError :: OutOfRangeHexEscape ) ;
181182 }
182183 let value = value as u8 ;
@@ -212,7 +213,7 @@ fn scan_escape(chars: &mut Chars<'_>, mode: Mode) -> Result<char, EscapeError> {
212213
213214 // Incorrect syntax has higher priority for error reporting
214215 // than unallowed value for a literal.
215- if mode . is_bytes ( ) {
216+ if is_byte {
216217 return Err ( EscapeError :: UnicodeEscapeInByte ) ;
217218 }
218219
@@ -244,23 +245,22 @@ fn scan_escape(chars: &mut Chars<'_>, mode: Mode) -> Result<char, EscapeError> {
244245}
245246
246247#[ 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 ( ) {
249250 // Byte literal can't be a non-ascii character.
250251 Err ( EscapeError :: NonAsciiCharInByte )
251252 } else {
252253 Ok ( c)
253254 }
254255}
255256
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 > {
258258 let c = chars. next ( ) . ok_or ( EscapeError :: ZeroChars ) ?;
259259 let res = match c {
260- '\\' => scan_escape ( chars, mode ) ,
260+ '\\' => scan_escape ( chars, is_byte ) ,
261261 '\n' | '\t' | '\'' => Err ( EscapeError :: EscapeOnlyChar ) ,
262262 '\r' => Err ( EscapeError :: BareCarriageReturn ) ,
263- _ => ascii_check ( c, mode ) ,
263+ _ => ascii_check ( c, is_byte ) ,
264264 } ?;
265265 if chars. next ( ) . is_some ( ) {
266266 return Err ( EscapeError :: MoreThanOneChar ) ;
@@ -270,11 +270,10 @@ fn unescape_char_or_byte(chars: &mut Chars<'_>, mode: Mode) -> Result<char, Esca
270270
271271/// Takes a contents of a string literal (without quotes) and produces a
272272/// 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 )
274274where
275275 F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
276276{
277- debug_assert ! ( mode == Mode :: Str || mode == Mode :: ByteStr ) ;
278277 let mut chars = src. chars ( ) ;
279278
280279 // The `start` and `end` computation here is complicated because
@@ -293,14 +292,14 @@ where
293292 skip_ascii_whitespace ( & mut chars, start, callback) ;
294293 continue ;
295294 }
296- _ => scan_escape ( & mut chars, mode ) ,
295+ _ => scan_escape ( & mut chars, is_byte ) ,
297296 }
298297 }
299298 '\n' => Ok ( '\n' ) ,
300299 '\t' => Ok ( '\t' ) ,
301300 '"' => Err ( EscapeError :: EscapeOnlyChar ) ,
302301 '\r' => Err ( EscapeError :: BareCarriageReturn ) ,
303- _ => ascii_check ( c, mode ) ,
302+ _ => ascii_check ( c, is_byte ) ,
304303 } ;
305304 let end = src. len ( ) - chars. as_str ( ) . len ( ) ;
306305 callback ( start..end, result) ;
@@ -337,11 +336,10 @@ where
337336/// sequence of characters or errors.
338337/// NOTE: Raw strings do not perform any explicit character escaping, here we
339338/// 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 )
341340where
342341 F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
343342{
344- debug_assert ! ( mode == Mode :: RawStr || mode == Mode :: RawByteStr ) ;
345343 let mut chars = src. chars ( ) ;
346344
347345 // The `start` and `end` computation here matches the one in
@@ -351,7 +349,7 @@ where
351349 let start = src. len ( ) - chars. as_str ( ) . len ( ) - c. len_utf8 ( ) ;
352350 let result = match c {
353351 '\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 ) ,
355353 c => Ok ( c) ,
356354 } ;
357355 let end = src. len ( ) - chars. as_str ( ) . len ( ) ;
0 commit comments