use crate::lexer::{JsSyntaxKind, T};
use crate::prelude::*;
use crate::JsParser;
use biome_parser::diagnostic::ParseDiagnostic;
#[derive(Debug)]
#[deprecated(note = "Use ParsedSyntax with ParseRecovery instead")]
pub(crate) struct SingleTokenParseRecovery {
error: Option<ParseDiagnostic>,
recovery: TokenSet<JsSyntaxKind>,
include_braces: bool,
bogus_node_kind: JsSyntaxKind,
}
#[allow(deprecated)]
impl SingleTokenParseRecovery {
pub fn new(recovery: TokenSet<JsSyntaxKind>, bogus_node_kind: JsSyntaxKind) -> Self {
Self {
error: None,
recovery,
include_braces: false,
bogus_node_kind,
}
}
pub fn recover(&self, p: &mut JsParser) {
let error = self.get_error();
if let Some(error) = error {
p.error(error);
}
if p.state().speculative_parsing {
return;
}
if !self.parsing_is_recoverable(p) {
let m = p.start();
p.bump_any();
m.complete(p, self.get_bogus_node_kind());
}
}
fn parsing_is_recoverable(&self, parser: &JsParser) -> bool {
self.is_at_token_set(parser) || self.is_at_braces(parser) || self.is_at_eof(parser)
}
fn get_error(&self) -> Option<ParseDiagnostic> {
self.error.clone()
}
fn get_bogus_node_kind(&self) -> JsSyntaxKind {
self.bogus_node_kind
}
fn is_at_braces(&self, parser: &JsParser) -> bool {
matches!(parser.cur(), T!['{'] | T!['}'] if self.include_braces)
}
fn is_at_token_set(&self, parser: &JsParser) -> bool {
parser.at_ts(self.recovery)
}
fn is_at_eof(&self, parser: &JsParser) -> bool {
parser.cur() == JsSyntaxKind::EOF
}
}