sway_core/language/ty/declaration/
const_generic.rs

1use 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}