sway_core/language/ty/declaration/
const_generic.rs1use crate::{
2 decl_engine::MaterializeConstGenerics,
3 language::{parsed::ConstGenericDeclaration, ty::TyExpression, CallPath},
4 semantic_analysis::{TypeCheckAnalysis, TypeCheckAnalysisContext},
5 SubstTypes, TypeId,
6};
7use serde::{Deserialize, Serialize};
8use sway_error::handler::{ErrorEmitted, Handler};
9use sway_types::{BaseIdent, Ident, Named, Span, Spanned};
10
11use super::TyDeclParsedType;
12
13#[derive(Clone, Debug, Serialize, Deserialize)]
14pub struct TyConstGenericDecl {
15 pub call_path: CallPath,
16 pub return_type: TypeId,
17 pub span: Span,
18 pub value: Option<TyExpression>,
19}
20
21impl SubstTypes for TyConstGenericDecl {
22 fn subst_inner(&mut self, ctx: &crate::SubstTypesContext) -> crate::HasChanges {
23 self.return_type.subst(ctx)
24 }
25}
26
27impl MaterializeConstGenerics for TyConstGenericDecl {
28 fn materialize_const_generics(
29 &mut self,
30 _engines: &crate::Engines,
31 _handler: &Handler,
32 name: &str,
33 value: &TyExpression,
34 ) -> Result<(), ErrorEmitted> {
35 if self.call_path.suffix.as_str() == name {
36 assert!(self.value.is_none());
37 self.value = Some(value.clone());
38 }
39 Ok(())
40 }
41}
42
43impl TypeCheckAnalysis for TyConstGenericDecl {
44 fn type_check_analyze(
45 &self,
46 _handler: &Handler,
47 _ctx: &mut TypeCheckAnalysisContext,
48 ) -> Result<(), ErrorEmitted> {
49 Ok(())
50 }
51}
52
53impl TyConstGenericDecl {
54 pub fn name(&self) -> &BaseIdent {
55 &self.call_path.suffix
56 }
57}
58
59impl Named for TyConstGenericDecl {
60 fn name(&self) -> &Ident {
61 &self.call_path.suffix
62 }
63}
64
65impl Spanned for TyConstGenericDecl {
66 fn span(&self) -> Span {
67 self.span.clone()
68 }
69}
70
71impl TyDeclParsedType for TyConstGenericDecl {
72 type ParsedType = ConstGenericDeclaration;
73}