Skip to main content

ktrs_parser/parsing/
optional_marker.rs

1//! `AbstractKotlinParsing.OptionalMarker`.
2
3use ktrs_syntax::SyntaxKind;
4
5use super::Parser;
6use crate::builder::Marker;
7
8pub struct OptionalMarker {
9    marker: Option<Marker>,
10    offset: i32,
11}
12
13impl OptionalMarker {
14    pub fn new(p: &mut Parser, actually_mark: bool) -> OptionalMarker {
15        let marker = actually_mark.then(|| p.mark());
16        OptionalMarker { marker, offset: p.my_builder.get_current_offset() }
17    }
18
19    pub fn done(&self, p: &mut Parser, element_type: SyntaxKind) {
20        let Some(marker) = self.marker else { return };
21        marker.done(p, element_type);
22    }
23
24    pub fn error(&self, p: &mut Parser, message: &str) {
25        let Some(marker) = self.marker else { return };
26        if self.offset == p.my_builder.get_current_offset() {
27            marker.drop(p); // no empty errors
28        } else {
29            marker.error(p, message);
30        }
31    }
32
33    pub fn drop(&self, p: &mut Parser) {
34        let Some(marker) = self.marker else { return };
35        marker.drop(p);
36    }
37}