sql_parse/
qualified_name.rs

1use alloc::vec::Vec;
2
3use crate::{
4    lexer::Token,
5    parser::{ParseError, Parser},
6    Identifier, Span, Spanned,
7};
8
9#[derive(Clone, Debug)]
10pub struct QualifiedName<'a> {
11    pub prefix: Vec<(Identifier<'a>, Span)>,
12    pub identifier: Identifier<'a>,
13}
14
15impl<'a> Spanned for QualifiedName<'a> {
16    fn span(&self) -> Span {
17        self.identifier.join_span(&self.prefix)
18    }
19}
20
21pub(crate) fn parse_qualified_name<'a>(
22    parser: &mut Parser<'a, '_>,
23) -> Result<QualifiedName<'a>, ParseError> {
24    let mut identifier = parser.consume_plain_identifier()?;
25    let mut prefix = Vec::new();
26    while let Some(dot) = parser.skip_token(Token::Period) {
27        prefix.push((identifier, dot));
28        identifier = parser.consume_plain_identifier()?;
29    }
30    Ok(QualifiedName { prefix, identifier })
31}