use skullbrain_diagnostics::{EmitDiagnostics, ParseError};
use skullbrain_lexer::{LiteralKind, TokenKind};
use crate::{
state::{ConcreteSyntaxTreeBuilder, PositionedToken},
Diagnostics, ParserState, SyntaxKind,
};
impl<'input, D: Diagnostics, C: ConcreteSyntaxTreeBuilder> ParserState<'input, D, C> {
pub(crate) fn parse_literal(&mut self) {
self.parse_token_with(SyntaxKind::Literal, |state, item| {
state.emit_diagnostic_if_required(&item);
})
}
fn emit_diagnostic_if_required(&mut self, item: &PositionedToken) {
match item.kind() {
TokenKind::Literial(kind) => match kind {
LiteralKind::Int { is_empty, .. } if *is_empty => {
self.emit_diagnostic_for_literal(item, ParseError::digits_for_number_is_empty())
}
LiteralKind::Double { empty_exponent, .. } if *empty_exponent => {
self.emit_diagnostic_for_literal(item, ParseError::exponent_float_is_empty())
}
LiteralKind::Str { is_terminated } if !is_terminated => {
self.emit_diagnostic_for_literal(item, ParseError::unterminated_string_quote())
}
LiteralKind::Boolean(_)
| LiteralKind::Str { .. }
| LiteralKind::Double { .. }
| LiteralKind::Int { .. } => (),
},
_ => unreachable!(),
};
}
fn emit_diagnostic_for_literal(&mut self, item: &PositionedToken, error: ParseError) {
let diagnostic_details = self.diagnostic_details_with_item(&item);
self.emit_diagnostic(error, diagnostic_details);
}
}