Add InString field to FullCodeCharKind
This commit is contained in:
parent
26fa7515e5
commit
9e963b87fc
@ -464,7 +464,7 @@ impl FindUncommented for str {
|
||||
return Some(i - pat.len());
|
||||
}
|
||||
Some(c) => match kind {
|
||||
FullCodeCharKind::Normal if b == c => {}
|
||||
FullCodeCharKind::Normal | FullCodeCharKind::InString if b == c => {}
|
||||
_ => {
|
||||
needle_iter = pat.chars();
|
||||
}
|
||||
@ -487,7 +487,7 @@ impl FindUncommented for str {
|
||||
pub fn find_comment_end(s: &str) -> Option<usize> {
|
||||
let mut iter = CharClasses::new(s.char_indices());
|
||||
for (kind, (i, _c)) in &mut iter {
|
||||
if kind == FullCodeCharKind::Normal {
|
||||
if kind == FullCodeCharKind::Normal || kind == FullCodeCharKind::InString {
|
||||
return Some(i);
|
||||
}
|
||||
}
|
||||
@ -568,15 +568,17 @@ enum FullCodeCharKind {
|
||||
InComment,
|
||||
/// Last character of a comment, '\n' for a line comment, '/' for a block comment.
|
||||
EndComment,
|
||||
/// Inside a string.
|
||||
InString,
|
||||
}
|
||||
|
||||
impl FullCodeCharKind {
|
||||
fn is_comment(&self) -> bool {
|
||||
match *self {
|
||||
FullCodeCharKind::Normal => false,
|
||||
FullCodeCharKind::StartComment |
|
||||
FullCodeCharKind::InComment |
|
||||
FullCodeCharKind::EndComment => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
@ -612,13 +614,23 @@ where
|
||||
fn next(&mut self) -> Option<(FullCodeCharKind, T::Item)> {
|
||||
let item = try_opt!(self.base.next());
|
||||
let chr = item.get_char();
|
||||
let mut char_kind = FullCodeCharKind::Normal;
|
||||
self.status = match self.status {
|
||||
CharClassesStatus::LitString => match chr {
|
||||
'"' => CharClassesStatus::Normal,
|
||||
'\\' => CharClassesStatus::LitStringEscape,
|
||||
_ => CharClassesStatus::LitString,
|
||||
'\\' => {
|
||||
char_kind = FullCodeCharKind::InString;
|
||||
CharClassesStatus::LitStringEscape
|
||||
}
|
||||
_ => {
|
||||
char_kind = FullCodeCharKind::InString;
|
||||
CharClassesStatus::LitString
|
||||
}
|
||||
},
|
||||
CharClassesStatus::LitStringEscape => CharClassesStatus::LitString,
|
||||
CharClassesStatus::LitStringEscape => {
|
||||
char_kind = FullCodeCharKind::InString;
|
||||
CharClassesStatus::LitString
|
||||
}
|
||||
CharClassesStatus::LitChar => match chr {
|
||||
'\\' => CharClassesStatus::LitCharEscape,
|
||||
'\'' => CharClassesStatus::Normal,
|
||||
@ -626,7 +638,10 @@ where
|
||||
},
|
||||
CharClassesStatus::LitCharEscape => CharClassesStatus::LitChar,
|
||||
CharClassesStatus::Normal => match chr {
|
||||
'"' => CharClassesStatus::LitString,
|
||||
'"' => {
|
||||
char_kind = FullCodeCharKind::InString;
|
||||
CharClassesStatus::LitString
|
||||
}
|
||||
'\'' => CharClassesStatus::LitChar,
|
||||
'/' => match self.base.peek() {
|
||||
Some(next) if next.get_char() == '*' => {
|
||||
@ -680,7 +695,7 @@ where
|
||||
}
|
||||
},
|
||||
};
|
||||
Some((FullCodeCharKind::Normal, item))
|
||||
Some((char_kind, item))
|
||||
}
|
||||
}
|
||||
|
||||
@ -707,9 +722,12 @@ impl<'a> Iterator for UngroupedCommentCodeSlices<'a> {
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
let (kind, (start_idx, _)) = try_opt!(self.iter.next());
|
||||
match kind {
|
||||
FullCodeCharKind::Normal => {
|
||||
FullCodeCharKind::Normal | FullCodeCharKind::InString => {
|
||||
// Consume all the Normal code
|
||||
while let Some(&(FullCodeCharKind::Normal, (_, _))) = self.iter.peek() {
|
||||
while let Some(&(char_kind, _)) = self.iter.peek() {
|
||||
if char_kind.is_comment() {
|
||||
break;
|
||||
}
|
||||
let _ = self.iter.next();
|
||||
}
|
||||
}
|
||||
@ -1032,7 +1050,7 @@ mod test {
|
||||
fn uncommented(text: &str) -> String {
|
||||
CharClasses::new(text.chars())
|
||||
.filter_map(|(s, c)| match s {
|
||||
FullCodeCharKind::Normal => Some(c),
|
||||
FullCodeCharKind::Normal | FullCodeCharKind::InString => Some(c),
|
||||
_ => None,
|
||||
})
|
||||
.collect()
|
||||
|
Loading…
x
Reference in New Issue
Block a user