use super::{ConcreteSyntaxTree, VB6Language};
use crate::errors::Span;
use crate::language::Token;
use crate::parsers::SyntaxKind;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RecoveryStrategy {
SingleToken,
ToNewline,
ProcedureTerminator,
}
#[derive(Debug, Clone)]
pub struct RecoveryEvent {
pub id: usize,
pub expected: Vec<String>,
pub found: Vec<Token>,
pub strategy: RecoveryStrategy,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct NodeRange {
pub start: u32,
pub end: u32,
}
impl ConcreteSyntaxTree {
#[must_use]
pub fn error_recovery_ranges(&self) -> Vec<NodeRange> {
let syntax_node = rowan::SyntaxNode::<VB6Language>::new_root(self.root.clone());
syntax_node
.descendants()
.filter(|node| node.kind() == SyntaxKind::ErrorRecovery)
.map(|node| {
let range = node.text_range();
NodeRange {
start: range.start().into(),
end: range.end().into(),
}
})
.collect()
}
}