1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use std::fmt;
use crate::{error::*, language::ty::*, type_system::*, types::DeterministicallyAborts};
use itertools::Itertools;
use sway_ast::Intrinsic;
use sway_types::Span;
#[derive(Debug, Clone, PartialEq)]
pub struct TyIntrinsicFunctionKind {
pub kind: Intrinsic,
pub arguments: Vec<TyExpression>,
pub type_arguments: Vec<TypeArgument>,
pub span: Span,
}
impl CopyTypes for TyIntrinsicFunctionKind {
fn copy_types_inner(&mut self, type_mapping: &TypeMapping) {
for arg in &mut self.arguments {
arg.copy_types(type_mapping);
}
for targ in &mut self.type_arguments {
targ.type_id.copy_types(type_mapping);
}
}
}
impl fmt::Display for TyIntrinsicFunctionKind {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let targs = self
.type_arguments
.iter()
.map(|targ| look_up_type_id(targ.type_id))
.join(", ");
let args = self.arguments.iter().map(|e| format!("{}", e)).join(", ");
write!(f, "{}::<{}>::({})", self.kind, targs, args)
}
}
impl DeterministicallyAborts for TyIntrinsicFunctionKind {
fn deterministically_aborts(&self) -> bool {
matches!(self.kind, Intrinsic::Revert)
|| self.arguments.iter().any(|x| x.deterministically_aborts())
}
}
impl CollectTypesMetadata for TyIntrinsicFunctionKind {
fn collect_types_metadata(
&self,
ctx: &mut CollectTypesMetadataContext,
) -> CompileResult<Vec<TypeMetadata>> {
let mut warnings = vec![];
let mut errors = vec![];
let mut types_metadata = vec![];
for type_arg in self.type_arguments.iter() {
types_metadata.append(&mut check!(
type_arg.type_id.collect_types_metadata(ctx),
return err(warnings, errors),
warnings,
errors
));
}
for arg in self.arguments.iter() {
types_metadata.append(&mut check!(
arg.collect_types_metadata(ctx),
return err(warnings, errors),
warnings,
errors
));
}
if matches!(self.kind, Intrinsic::Log) {
types_metadata.push(TypeMetadata::LoggedType(
LogId::new(ctx.log_id_counter()),
self.arguments[0].return_type,
));
*ctx.log_id_counter_mut() += 1;
}
ok(types_metadata, warnings, errors)
}
}