sqruff_lib_core/parser/segments/
select.rs1use crate::dialects::common::ColumnAliasInfo;
2use crate::dialects::syntax::{SyntaxKind, SyntaxSet};
3use crate::parser::segments::ErasedSegment;
4
5#[derive(Clone)]
6pub struct SelectClauseElementSegment(pub ErasedSegment);
7
8impl SelectClauseElementSegment {
9 pub fn alias(&self) -> Option<ColumnAliasInfo> {
10 let alias_expression_segment = self
11 .0
12 .recursive_crawl(
13 const { &SyntaxSet::new(&[SyntaxKind::AliasExpression]) },
14 true,
15 &SyntaxSet::EMPTY,
16 true,
17 )
18 .first()?
19 .clone();
20
21 let alias_identifier_segment = alias_expression_segment.segments().iter().find(|it| {
22 matches!(
23 it.get_type(),
24 SyntaxKind::NakedIdentifier | SyntaxKind::Identifier
25 )
26 })?;
27
28 let aliased_segment = self
29 .0
30 .segments()
31 .iter()
32 .find(|&s| !s.is_whitespace() && !s.is_meta() && s != &alias_expression_segment)
33 .unwrap();
34
35 let mut column_reference_segments = Vec::new();
36 if aliased_segment.is_type(SyntaxKind::ColumnReference) {
37 column_reference_segments.push(aliased_segment.clone());
38 } else {
39 column_reference_segments.extend(aliased_segment.recursive_crawl(
40 const { &SyntaxSet::new(&[SyntaxKind::ColumnReference]) },
41 true,
42 &SyntaxSet::EMPTY,
43 true,
44 ));
45 }
46
47 Some(ColumnAliasInfo {
48 alias_identifier_name: alias_identifier_segment.raw().clone(),
49 aliased_segment: aliased_segment.clone(),
50 column_reference_segments,
51 })
52 }
53}