@@ -464,7 +464,7 @@ impl FindUncommented for str {
464
464
return Some ( i - pat. len ( ) ) ;
465
465
}
466
466
Some ( c) => match kind {
467
- FullCodeCharKind :: Normal if b == c => { }
467
+ FullCodeCharKind :: Normal | FullCodeCharKind :: InString if b == c => { }
468
468
_ => {
469
469
needle_iter = pat. chars ( ) ;
470
470
}
@@ -487,7 +487,7 @@ impl FindUncommented for str {
487
487
pub fn find_comment_end ( s : & str ) -> Option < usize > {
488
488
let mut iter = CharClasses :: new ( s. char_indices ( ) ) ;
489
489
for ( kind, ( i, _c) ) in & mut iter {
490
- if kind == FullCodeCharKind :: Normal {
490
+ if kind == FullCodeCharKind :: Normal || kind == FullCodeCharKind :: InString {
491
491
return Some ( i) ;
492
492
}
493
493
}
@@ -568,15 +568,17 @@ enum FullCodeCharKind {
568
568
InComment ,
569
569
/// Last character of a comment, '\n' for a line comment, '/' for a block comment.
570
570
EndComment ,
571
+ /// Inside a string.
572
+ InString ,
571
573
}
572
574
573
575
impl FullCodeCharKind {
574
576
fn is_comment ( & self ) -> bool {
575
577
match * self {
576
- FullCodeCharKind :: Normal => false ,
577
578
FullCodeCharKind :: StartComment |
578
579
FullCodeCharKind :: InComment |
579
580
FullCodeCharKind :: EndComment => true ,
581
+ _ => false ,
580
582
}
581
583
}
582
584
@@ -612,21 +614,34 @@ where
612
614
fn next ( & mut self ) -> Option < ( FullCodeCharKind , T :: Item ) > {
613
615
let item = try_opt ! ( self . base. next( ) ) ;
614
616
let chr = item. get_char ( ) ;
617
+ let mut char_kind = FullCodeCharKind :: Normal ;
615
618
self . status = match self . status {
616
619
CharClassesStatus :: LitString => match chr {
617
620
'"' => CharClassesStatus :: Normal ,
618
- '\\' => CharClassesStatus :: LitStringEscape ,
619
- _ => CharClassesStatus :: LitString ,
621
+ '\\' => {
622
+ char_kind = FullCodeCharKind :: InString ;
623
+ CharClassesStatus :: LitStringEscape
624
+ }
625
+ _ => {
626
+ char_kind = FullCodeCharKind :: InString ;
627
+ CharClassesStatus :: LitString
628
+ }
620
629
} ,
621
- CharClassesStatus :: LitStringEscape => CharClassesStatus :: LitString ,
630
+ CharClassesStatus :: LitStringEscape => {
631
+ char_kind = FullCodeCharKind :: InString ;
632
+ CharClassesStatus :: LitString
633
+ }
622
634
CharClassesStatus :: LitChar => match chr {
623
635
'\\' => CharClassesStatus :: LitCharEscape ,
624
636
'\'' => CharClassesStatus :: Normal ,
625
637
_ => CharClassesStatus :: LitChar ,
626
638
} ,
627
639
CharClassesStatus :: LitCharEscape => CharClassesStatus :: LitChar ,
628
640
CharClassesStatus :: Normal => match chr {
629
- '"' => CharClassesStatus :: LitString ,
641
+ '"' => {
642
+ char_kind = FullCodeCharKind :: InString ;
643
+ CharClassesStatus :: LitString
644
+ }
630
645
'\'' => CharClassesStatus :: LitChar ,
631
646
'/' => match self . base . peek ( ) {
632
647
Some ( next) if next. get_char ( ) == '*' => {
@@ -680,7 +695,7 @@ where
680
695
}
681
696
} ,
682
697
} ;
683
- Some ( ( FullCodeCharKind :: Normal , item) )
698
+ Some ( ( char_kind , item) )
684
699
}
685
700
}
686
701
@@ -707,9 +722,12 @@ impl<'a> Iterator for UngroupedCommentCodeSlices<'a> {
707
722
fn next ( & mut self ) -> Option < Self :: Item > {
708
723
let ( kind, ( start_idx, _) ) = try_opt ! ( self . iter. next( ) ) ;
709
724
match kind {
710
- FullCodeCharKind :: Normal => {
725
+ FullCodeCharKind :: Normal | FullCodeCharKind :: InString => {
711
726
// Consume all the Normal code
712
- while let Some ( & ( FullCodeCharKind :: Normal , ( _, _) ) ) = self . iter . peek ( ) {
727
+ while let Some ( & ( char_kind, _) ) = self . iter . peek ( ) {
728
+ if char_kind. is_comment ( ) {
729
+ break ;
730
+ }
713
731
let _ = self . iter . next ( ) ;
714
732
}
715
733
}
@@ -1032,7 +1050,7 @@ mod test {
1032
1050
fn uncommented ( text : & str ) -> String {
1033
1051
CharClasses :: new ( text. chars ( ) )
1034
1052
. filter_map ( |( s, c) | match s {
1035
- FullCodeCharKind :: Normal => Some ( c) ,
1053
+ FullCodeCharKind :: Normal | FullCodeCharKind :: InString => Some ( c) ,
1036
1054
_ => None ,
1037
1055
} )
1038
1056
. collect ( )
0 commit comments