use super::metadata::AstNodeMeta;
use crate::parser::{
error::{ParserError, ParserErrorVariant},
lexer::{
tokens::{Token, TokenTy},
IndexedToken,
},
state::ParserState,
util::NodeParserResult,
};
#[derive(Debug, Clone, Copy)]
pub struct Identifier<'src> {
pub inner: AstNodeMeta<'src>,
}
impl<'src> Identifier<'src> {
pub fn matching_source(&self) -> &'src str {
self.inner.matching_source
}
}
pub fn parse_identifier<'src>(
parser_state: &mut ParserState<'src>,
) -> NodeParserResult<Identifier<'src>> {
let IndexedToken {
index,
token: Token { length, .. },
} = parser_state
.next_token_if_ty_eq(TokenTy::Identifier)
.ok_or_else(|| ParserError {
byte_range: parser_state.peek_byte_range(),
ty: ParserErrorVariant::Expected("identifer"),
})?;
Ok(Identifier {
inner: parser_state.make_ast_node_meta(index, length),
})
}