Diagnostic at caller span + panic-mode sync; stops at statement boundary or bracket close. */
(&mut self, start: usize, end: usize, msg: &str)
| 321 | |
| 322 | /* Diagnostic at caller span + panic-mode sync; stops at statement boundary or bracket close. */ |
| 323 | pub(super) fn error_at(&mut self, start: usize, end: usize, msg: &str) { |
| 324 | self.errors.push(Diagnostic { start, end, msg: msg.to_string() }); |
| 325 | let in_brackets = !self.bracket_stack.is_empty(); |
| 326 | let mut depth: i32 = 0; |
| 327 | loop { |
| 328 | let kind = self.tokens.peek().map(|t| t.kind); |
| 329 | match kind { |
| 330 | None | Some(TokenType::Newline | TokenType::Dedent | TokenType::Endmarker) => break, |
| 331 | Some(TokenType::Comma) if in_brackets && depth == 0 => break, |
| 332 | Some(TokenType::Rpar | TokenType::Rsqb | TokenType::Rbrace) => { |
| 333 | if in_brackets && depth == 0 { break; } |
| 334 | depth -= 1; |
| 335 | self.tokens.next(); |
| 336 | } |
| 337 | Some(TokenType::Lpar | TokenType::Lsqb | TokenType::Lbrace) => { |
| 338 | depth += 1; |
| 339 | self.tokens.next(); |
| 340 | } |
| 341 | _ => { self.tokens.next(); } |
| 342 | } |
| 343 | } |
| 344 | } |
| 345 | |
| 346 | pub(super) fn at_end(&mut self) -> bool { self.peek().is_none() } |
| 347 |
no test coverage detected