Skip to main content

qusql_parse/
qualified_name.rs

1use alloc::vec::Vec;
2
3use crate::{
4    Identifier, Span, Spanned,
5    keywords::Restrict,
6    lexer::Token,
7    parser::{ParseError, Parser},
8};
9
10#[derive(Clone, Debug)]
11pub struct QualifiedName<'a> {
12    pub prefix: Vec<(Identifier<'a>, Span)>,
13    pub identifier: Identifier<'a>,
14}
15
16impl<'a> Spanned for QualifiedName<'a> {
17    fn span(&self) -> Span {
18        self.identifier.join_span(&self.prefix)
19    }
20}
21
22pub(crate) fn parse_qualified_name_restrict<'a>(
23    parser: &mut Parser<'a, '_>,
24    restricted: Restrict,
25) -> Result<QualifiedName<'a>, ParseError> {
26    let mut identifier = parser.consume_plain_identifier_restrict(restricted)?;
27    let mut prefix = Vec::new();
28    while let Some(dot) = parser.skip_token(Token::Period) {
29        prefix.push((identifier, dot));
30        identifier = parser.consume_plain_identifier_restrict(restricted)?;
31    }
32    Ok(QualifiedName { prefix, identifier })
33}
34
35/// Convenience wrapper for parse_qualified_name with no keyword restrictions.
36#[inline]
37pub(crate) fn parse_qualified_name_unreserved<'a>(
38    parser: &mut Parser<'a, '_>,
39) -> Result<QualifiedName<'a>, ParseError> {
40    parse_qualified_name_restrict(parser, parser.reserved())
41}