use crate::parser::rewrite_parser::{RewriteParser, RewriteToken};
use crate::parser::JsParserCheckpoint;
use crate::JsParser;
use biome_js_syntax::JsSyntaxKind;
use biome_parser::tree_sink::TreeSink;
use biome_parser::{event::process, prelude::*};
use biome_rowan::TextSize;
struct RewriteParseEventsTreeSink<'r, 'p, T> {
reparse: &'r mut T,
parser: RewriteParser<'r, 'p>,
}
impl<'r, 'p, T: RewriteParseEvents> TreeSink for RewriteParseEventsTreeSink<'r, 'p, T> {
type Kind = JsSyntaxKind;
fn token(&mut self, kind: JsSyntaxKind, end: TextSize) {
self.reparse
.token(RewriteToken::new(kind, end), &mut self.parser);
}
fn start_node(&mut self, kind: JsSyntaxKind) {
self.reparse.start_node(kind, &mut self.parser);
}
fn finish_node(&mut self) {
self.reparse.finish_node(&mut self.parser);
}
fn errors(&mut self, _errors: Vec<ParseDiagnostic>) {}
}
pub(crate) trait RewriteParseEvents {
fn start_node(&mut self, kind: JsSyntaxKind, p: &mut RewriteParser);
fn finish_node(&mut self, p: &mut RewriteParser);
fn token(&mut self, token: RewriteToken, p: &mut RewriteParser) {
p.bump(token)
}
}
pub(crate) fn rewrite_events<T: RewriteParseEvents>(
rewriter: &mut T,
checkpoint: JsParserCheckpoint,
p: &mut JsParser,
) {
let events: Vec<_> = unsafe {
p.context_mut()
.split_off_events(checkpoint.context.event_position() + 1)
};
let mut sink = RewriteParseEventsTreeSink {
parser: RewriteParser::new(p, checkpoint.source),
reparse: rewriter,
};
process(&mut sink, events, Vec::default());
sink.parser.finish();
}