(&mut self, start: usize)
| 115 | } |
| 116 | |
| 117 | fn scan_number(&mut self, start: usize) -> TokenType { |
| 118 | if self.src[start] == b'0' && self.pos < self.src.len() { |
| 119 | match self.src[self.pos] { |
| 120 | b'x' | b'X' => { self.pos += 1; let b = self.pos; self.scan_hex_digits(); self.check_digits(b, self.pos, false); return TokenType::Int; } |
| 121 | b'o' | b'O' => { self.pos += 1; let b = self.pos; self.scan_oct_digits(); self.check_digits(b, self.pos, false); return TokenType::Int; } |
| 122 | b'b' | b'B' => { self.pos += 1; let b = self.pos; self.scan_bin_digits(); self.check_digits(b, self.pos, false); return TokenType::Int; } |
| 123 | _ => {} |
| 124 | } |
| 125 | } |
| 126 | self.scan_digits(); |
| 127 | self.check_digits(start, self.pos, false); |
| 128 | let mut is_float = false; |
| 129 | if self.pos < self.src.len() && self.src[self.pos] == b'.' && self.at(1) != Some(b'.') { |
| 130 | is_float = true; |
| 131 | self.pos += 1; |
| 132 | let frac_start = self.pos; |
| 133 | self.scan_digits(); |
| 134 | // Trailing dot like `5.` is valid; only validate non-empty fractions. |
| 135 | self.check_digits(frac_start, self.pos, true); |
| 136 | } |
| 137 | is_float |= self.scan_exponent(); |
| 138 | if is_float { TokenType::Float } else { TokenType::Int } |
| 139 | } |
| 140 | |
| 141 | fn scan_dot_number(&mut self) -> TokenType { |
| 142 | let body_start = self.pos; |
no test coverage detected