skip(mut s: &str) -> &str1pub fn skip(mut s: &str) -> &str { 2 'skip: while !s.is_empty() { 3 let byte = s.as_bytes()[0]; 4 if byte == b'/' { 5 if s.starts_with("//") 6 && (!s.starts_with("///") || s.starts_with("////")) 7 && !s.starts_with("//!") 8 { 9 if let Some(i) = s.find('\n') { 10 s = &s[i + 1..]; 11 continue; 12 } else { 13 return ""; 14 } 15 } else if s.starts_with("/**/") { 16 s = &s[4..]; 17 continue; 18 } else if s.starts_with("/*") 19 && (!s.starts_with("/**") || s.starts_with("/***")) 20 && !s.starts_with("/*!") 21 { 22 let mut depth = 0; 23 let bytes = s.as_bytes(); 24 let mut i = 0; 25 let upper = bytes.len() - 1; 26 while i < upper { 27 if bytes[i] == b'/' && bytes[i + 1] == b'*' { 28 depth += 1; 29 i += 1; // eat '*' 30 } else if bytes[i] == b'*' && bytes[i + 1] == b'/' { 31 depth -= 1; 32 if depth == 0 { 33 s = &s[i + 2..]; 34 continue 'skip; 35 } 36 i += 1; // eat '/' 37 } 38 i += 1; 39 } 40 return s; 41 } 42 } 43 match byte { 44 b' ' | 0x09..=0x0d => { 45 s = &s[1..]; 46 continue; 47 } 48 b if b <= 0x7f => {} 49 _ => { 50 let ch = s.chars().next().unwrap(); 51 if is_whitespace(ch) { 52 s = &s[ch.len_utf8()..]; 53 continue; 54 } 55 } 56 } 57 return s; 58 } 59 s 60 } 61 is_whitespace(ch: char) -> bool62fn is_whitespace(ch: char) -> bool { 63 // Rust treats left-to-right mark and right-to-left mark as whitespace 64 ch.is_whitespace() || ch == '\u{200e}' || ch == '\u{200f}' 65 } 66