sql_fun_sqlast/sem/
create_domain.rs1use 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#[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 #[must_use]
20 pub fn name(&self) -> &FullName {
21 self.type_ref.full_name()
22 }
23
24 #[must_use]
26 pub fn type_ref(&self) -> &TypeReference {
27 &self.type_ref
28 }
29}
30
31pub 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}