@@ -818,96 +818,94 @@ fn find_skips_from_snippet(
818
818
_ => return ( vec ! [ ] , false ) ,
819
819
} ;
820
820
821
- fn find_skips ( snippet : & str , is_raw : bool ) -> Vec < usize > {
822
- let mut s = snippet. char_indices ( ) ;
823
- let mut skips = vec ! [ ] ;
824
- while let Some ( ( pos, c) ) = s. next ( ) {
825
- match ( c, s. clone ( ) . next ( ) ) {
826
- // skip whitespace and empty lines ending in '\\'
827
- ( '\\' , Some ( ( next_pos, '\n' ) ) ) if !is_raw => {
828
- skips. push ( pos) ;
829
- skips. push ( next_pos) ;
830
- let _ = s. next ( ) ;
821
+ if str_style. is_some ( ) {
822
+ return ( vec ! [ ] , true ) ;
823
+ }
831
824
832
- while let Some ( ( pos, c) ) = s. clone ( ) . next ( ) {
833
- if matches ! ( c, ' ' | '\n' | '\t' ) {
834
- skips. push ( pos) ;
835
- let _ = s. next ( ) ;
836
- } else {
837
- break ;
838
- }
839
- }
840
- }
841
- ( '\\' , Some ( ( next_pos, 'n' | 't' | 'r' | '0' | '\\' | '\'' | '\"' ) ) ) => {
842
- skips. push ( next_pos) ;
843
- let _ = s. next ( ) ;
844
- }
845
- ( '\\' , Some ( ( _, 'x' ) ) ) if !is_raw => {
846
- for _ in 0 ..3 {
847
- // consume `\xAB` literal
848
- if let Some ( ( pos, _) ) = s. next ( ) {
849
- skips. push ( pos) ;
850
- } else {
851
- break ;
852
- }
825
+ let snippet = & snippet[ 1 ..snippet. len ( ) - 1 ] ;
826
+
827
+ let mut s = snippet. char_indices ( ) ;
828
+ let mut skips = vec ! [ ] ;
829
+ while let Some ( ( pos, c) ) = s. next ( ) {
830
+ match ( c, s. clone ( ) . next ( ) ) {
831
+ // skip whitespace and empty lines ending in '\\'
832
+ ( '\\' , Some ( ( next_pos, '\n' ) ) ) => {
833
+ skips. push ( pos) ;
834
+ skips. push ( next_pos) ;
835
+ let _ = s. next ( ) ;
836
+
837
+ while let Some ( ( pos, c) ) = s. clone ( ) . next ( ) {
838
+ if matches ! ( c, ' ' | '\n' | '\t' ) {
839
+ skips. push ( pos) ;
840
+ let _ = s. next ( ) ;
841
+ } else {
842
+ break ;
853
843
}
854
844
}
855
- ( '\\' , Some ( ( _, 'u' ) ) ) if !is_raw => {
845
+ }
846
+ ( '\\' , Some ( ( next_pos, 'n' | 't' | 'r' | '0' | '\\' | '\'' | '\"' ) ) ) => {
847
+ skips. push ( next_pos) ;
848
+ let _ = s. next ( ) ;
849
+ }
850
+ ( '\\' , Some ( ( _, 'x' ) ) ) => {
851
+ for _ in 0 ..3 {
852
+ // consume `\xAB` literal
856
853
if let Some ( ( pos, _) ) = s. next ( ) {
857
854
skips. push ( pos) ;
855
+ } else {
856
+ break ;
858
857
}
859
- if let Some ( ( next_pos, next_c) ) = s. next ( ) {
860
- if next_c == '{' {
861
- // consume up to 6 hexanumeric chars
862
- let digits_len =
863
- s. clone ( ) . take ( 6 ) . take_while ( |( _, c) | c. is_digit ( 16 ) ) . count ( ) ;
864
-
865
- let len_utf8 = s
866
- . as_str ( )
867
- . get ( ..digits_len)
868
- . and_then ( |digits| u32:: from_str_radix ( digits, 16 ) . ok ( ) )
869
- . and_then ( char:: from_u32)
870
- . map_or ( 1 , char:: len_utf8) ;
871
-
872
- // Skip the digits, for chars that encode to more than 1 utf-8 byte
873
- // exclude as many digits as it is greater than 1 byte
874
- //
875
- // So for a 3 byte character, exclude 2 digits
876
- let required_skips =
877
- digits_len. saturating_sub ( len_utf8. saturating_sub ( 1 ) ) ;
878
-
879
- // skip '{' and '}' also
880
- for pos in ( next_pos..) . take ( required_skips + 2 ) {
881
- skips. push ( pos)
882
- }
858
+ }
859
+ }
860
+ ( '\\' , Some ( ( _, 'u' ) ) ) => {
861
+ if let Some ( ( pos, _) ) = s. next ( ) {
862
+ skips. push ( pos) ;
863
+ }
864
+ if let Some ( ( next_pos, next_c) ) = s. next ( ) {
865
+ if next_c == '{' {
866
+ // consume up to 6 hexanumeric chars
867
+ let digits_len =
868
+ s. clone ( ) . take ( 6 ) . take_while ( |( _, c) | c. is_digit ( 16 ) ) . count ( ) ;
869
+
870
+ let len_utf8 = s
871
+ . as_str ( )
872
+ . get ( ..digits_len)
873
+ . and_then ( |digits| u32:: from_str_radix ( digits, 16 ) . ok ( ) )
874
+ . and_then ( char:: from_u32)
875
+ . map_or ( 1 , char:: len_utf8) ;
876
+
877
+ // Skip the digits, for chars that encode to more than 1 utf-8 byte
878
+ // exclude as many digits as it is greater than 1 byte
879
+ //
880
+ // So for a 3 byte character, exclude 2 digits
881
+ let required_skips = digits_len. saturating_sub ( len_utf8. saturating_sub ( 1 ) ) ;
882
+
883
+ // skip '{' and '}' also
884
+ for pos in ( next_pos..) . take ( required_skips + 2 ) {
885
+ skips. push ( pos)
886
+ }
883
887
884
- s. nth ( digits_len) ;
885
- } else if next_c. is_digit ( 16 ) {
886
- skips. push ( next_pos) ;
887
- // We suggest adding `{` and `}` when appropriate, accept it here as if
888
- // it were correct
889
- let mut i = 0 ; // consume up to 6 hexanumeric chars
890
- while let ( Some ( ( next_pos, c) ) , _) = ( s. next ( ) , i < 6 ) {
891
- if c. is_digit ( 16 ) {
892
- skips. push ( next_pos) ;
893
- } else {
894
- break ;
895
- }
896
- i += 1 ;
888
+ s. nth ( digits_len) ;
889
+ } else if next_c. is_digit ( 16 ) {
890
+ skips. push ( next_pos) ;
891
+ // We suggest adding `{` and `}` when appropriate, accept it here as if
892
+ // it were correct
893
+ let mut i = 0 ; // consume up to 6 hexanumeric chars
894
+ while let ( Some ( ( next_pos, c) ) , _) = ( s. next ( ) , i < 6 ) {
895
+ if c. is_digit ( 16 ) {
896
+ skips. push ( next_pos) ;
897
+ } else {
898
+ break ;
897
899
}
900
+ i += 1 ;
898
901
}
899
902
}
900
903
}
901
- _ => { }
902
904
}
905
+ _ => { }
903
906
}
904
- skips
905
907
}
906
-
907
- let r_start = str_style. map_or ( 0 , |r| r + 1 ) ;
908
- let r_end = str_style. unwrap_or ( 0 ) ;
909
- let s = & snippet[ r_start + 1 ..snippet. len ( ) - r_end - 1 ] ;
910
- ( find_skips ( s, str_style. is_some ( ) ) , true )
908
+ ( skips, true )
911
909
}
912
910
913
911
#[ cfg( test) ]
0 commit comments