sway_core/language/ty/declaration/
trait_fn.rs1use std::{
2 fmt,
3 hash::{Hash, Hasher},
4};
5
6use monomorphization::MonomorphizeHelper;
7use sway_error::handler::Handler;
8use sway_types::{Ident, Named, Span, Spanned};
9
10use crate::{
11 ast_elements::type_argument::GenericTypeArgument,
12 engine_threading::*,
13 has_changes,
14 language::{parsed::TraitFn, ty::*, Purity},
15 transform,
16 type_system::*,
17 HasChanges,
18};
19
20#[derive(Clone, Debug)]
21pub struct TyTraitFn {
22 pub name: Ident,
23 pub(crate) span: Span,
24 pub(crate) purity: Purity,
25 pub parameters: Vec<TyFunctionParameter>,
26 pub return_type: GenericTypeArgument,
27 pub attributes: transform::Attributes,
28}
29
30impl TyDeclParsedType for TyTraitFn {
31 type ParsedType = TraitFn;
32}
33
34impl DebugWithEngines for TyTraitFn {
35 fn fmt(&self, f: &mut fmt::Formatter<'_>, engines: &Engines) -> fmt::Result {
36 write!(
37 f,
38 "{:?}({}):{}",
39 self.name,
40 self.parameters
41 .iter()
42 .map(|p| format!(
43 "{}:{}",
44 p.name.as_str(),
45 engines.help_out(p.type_argument.initial_type_id)
46 ))
47 .collect::<Vec<_>>()
48 .join(", "),
49 engines.help_out(self.return_type.initial_type_id),
50 )
51 }
52}
53
54impl Named for TyTraitFn {
55 fn name(&self) -> &Ident {
56 &self.name
57 }
58}
59
60impl Spanned for TyTraitFn {
61 fn span(&self) -> Span {
62 self.span.clone()
63 }
64}
65
66impl IsConcrete for TyTraitFn {
67 fn is_concrete(&self, handler: &Handler, engines: &Engines) -> bool {
68 self.type_parameters()
69 .iter()
70 .all(|tp| tp.is_concrete(handler, engines))
71 && self
72 .return_type
73 .type_id
74 .is_concrete(engines, TreatNumericAs::Concrete)
75 && self.parameters().iter().all(|t| {
76 t.type_argument
77 .type_id
78 .is_concrete(engines, TreatNumericAs::Concrete)
79 })
80 }
81}
82
83impl declaration::FunctionSignature for TyTraitFn {
84 fn parameters(&self) -> &Vec<TyFunctionParameter> {
85 &self.parameters
86 }
87
88 fn return_type(&self) -> &GenericTypeArgument {
89 &self.return_type
90 }
91}
92
93impl EqWithEngines for TyTraitFn {}
94impl PartialEqWithEngines for TyTraitFn {
95 fn eq(&self, other: &Self, ctx: &PartialEqWithEnginesContext) -> bool {
96 let type_engine = ctx.engines().te();
97 self.name == other.name
98 && self.purity == other.purity
99 && self.parameters.eq(&other.parameters, ctx)
100 && type_engine
101 .get(self.return_type.type_id)
102 .eq(&type_engine.get(other.return_type.type_id), ctx)
103 && self.attributes == other.attributes
104 }
105}
106
107impl HashWithEngines for TyTraitFn {
108 fn hash<H: Hasher>(&self, state: &mut H, engines: &Engines) {
109 let TyTraitFn {
110 name,
111 purity,
112 parameters,
113 return_type,
114 span: _,
117 attributes: _,
118 } = self;
119 let type_engine = engines.te();
120 name.hash(state);
121 parameters.hash(state, engines);
122 type_engine.get(return_type.type_id).hash(state, engines);
123 purity.hash(state);
124 }
125}
126
127impl SubstTypes for TyTraitFn {
128 fn subst_inner(&mut self, ctx: &SubstTypesContext) -> HasChanges {
129 has_changes! {
130 self.parameters.subst(ctx);
131 self.return_type.subst(ctx);
132 }
133 }
134}
135
136impl MonomorphizeHelper for TyTraitFn {
137 fn name(&self) -> &Ident {
138 &self.name
139 }
140
141 fn type_parameters(&self) -> &[TypeParameter] {
142 &[]
143 }
144
145 fn has_self_type_param(&self) -> bool {
146 false
147 }
148}