qusql_parse/
qualified_name.rs1use 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#[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}