Skip to main content

sql_fun_sqlast/sem/
create_domain.rs

1use sql_fun_core::IVec;
2
3use crate::{
4    sem::{AstAndContextPair, TypeReference},
5    syn::{Opt, ScanToken},
6};
7
8use super::{AnalysisError, AnalysisProblem, FullName, ParseContext, SemAst};
9
10/// analyzed [`crate::syn::CreateDomainStmt`]
11#[derive(Debug, Clone, Eq, Hash, PartialEq, serde::Serialize, serde::Deserialize)]
12pub struct CreateDomain {
13    type_ref: TypeReference,
14    base_type: Option<FullName>,
15}
16
17impl CreateDomain {
18    /// get name
19    #[must_use]
20    pub fn name(&self) -> &FullName {
21        self.type_ref.full_name()
22    }
23
24    /// get base type reference
25    #[must_use]
26    pub fn type_ref(&self) -> &TypeReference {
27        &self.type_ref
28    }
29}
30
31/// analyze [`crate::syn::CreateDomainStmt`]
32pub fn analyze_create_domain<TParseContext>(
33    mut context: TParseContext,
34    syn: crate::syn::CreateDomainStmt,
35    tokens: &IVec<ScanToken>,
36) -> Result<AstAndContextPair<TParseContext>, AnalysisError>
37where
38    TParseContext: ParseContext,
39{
40    let name = FullName::try_from(syn.get_domainname())?;
41    let Some(base) = syn.get_type_name().as_inner() else {
42        AnalysisError::raise_unexpected_none("create_domain_stmt.type_name")?
43    };
44
45    let base_span = base.get_name_span(tokens);
46
47    let create_domain =
48        if let Some(base_type) = context.get_type(&FullName::try_from(base.clone())?) {
49            CreateDomain {
50                type_ref: TypeReference::from_full_name(name),
51                base_type: base_type.full_name().cloned(),
52            }
53        } else {
54            context.report_problem(AnalysisProblem::domain_type_name_not_found(
55                &name, &base, &base_span,
56            ))?;
57            CreateDomain {
58                type_ref: TypeReference::from_full_name(name),
59                base_type: None,
60            }
61        };
62    let result_context = context.apply_create_domain(&create_domain)?;
63    Ok(AstAndContextPair::new(
64        SemAst::CreateDomain(create_domain),
65        result_context,
66    ))
67}