sqruff_lib_core/parser/segments/
join.rs

1use crate::dialects::common::AliasInfo;
2use crate::dialects::syntax::{SyntaxKind, SyntaxSet};
3use crate::parser::segments::base::ErasedSegment;
4use crate::parser::segments::from::FromExpressionElementSegment;
5
6pub struct JoinClauseSegment(pub ErasedSegment);
7
8impl JoinClauseSegment {
9    pub fn eventual_aliases(&self) -> Vec<(ErasedSegment, AliasInfo)> {
10        let mut buff = Vec::new();
11
12        let from_expression = self
13            .0
14            .child(const { &SyntaxSet::new(&[SyntaxKind::FromExpressionElement]) })
15            .unwrap();
16        let alias = FromExpressionElementSegment(from_expression.clone()).eventual_alias();
17
18        buff.push((from_expression.clone(), alias));
19
20        for join_clause in self.0.recursive_crawl(
21            const { &SyntaxSet::new(&[SyntaxKind::JoinClause]) },
22            true,
23            const { &SyntaxSet::single(SyntaxKind::SelectStatement) },
24            true,
25        ) {
26            if join_clause.id() == join_clause.id() {
27                continue;
28            }
29
30            let aliases = JoinClauseSegment(join_clause).eventual_aliases();
31
32            if !aliases.is_empty() {
33                buff.extend(aliases);
34            }
35        }
36
37        buff
38    }
39}