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