Skip to main content

typr_core/utils/
builder.rs

1#![allow(
2    dead_code,
3    unused_variables,
4    unused_imports,
5    unreachable_code,
6    unused_assignments
7)]
8
9use crate::components::error_message::type_error::TypeError;
10use crate::components::r#type::argument_type::ArgumentType;
11use crate::components::r#type::type_operator::TypeOperator;
12use crate::components::error_message::help_data::HelpData;
13use crate::components::r#type::vector_type::VecType;
14use crate::components::language::operators::Op;
15use crate::components::r#type::tchar::Tchar;
16use crate::components::r#type::tint::Tint;
17use crate::components::language::var::Var;
18use crate::components::language::Lang;
19use crate::components::r#type::Type;
20use std::collections::HashSet;
21use crate::TypRError;
22
23pub fn generic_type() -> Type {
24    Type::Generic("T".to_string(), HelpData::default())
25}
26
27pub fn self_generic_type() -> Type {
28    Type::Generic("Self".to_string(), HelpData::default())
29}
30
31pub fn empty_type() -> Type {
32    Type::Empty(HelpData::default())
33}
34
35pub fn empty_lang() -> Lang {
36    Lang::Empty(HelpData::default())
37}
38
39pub fn any_type() -> Type {
40    Type::Any(HelpData::default())
41}
42
43pub fn integer_type(i: i32) -> Type {
44    Type::Integer(Tint::Val(i), HelpData::default())
45}
46
47pub fn integer_type_default() -> Type {
48    Type::Integer(Tint::Unknown, HelpData::default())
49}
50
51pub fn character_type(s: &str) -> Type {
52    Type::Char(Tchar::Val(s.to_string()), HelpData::default())
53}
54
55pub fn character_type_default() -> Type {
56    Type::Char(Tchar::Unknown, HelpData::default())
57}
58
59pub fn number_type() -> Type {
60    Type::Number(HelpData::default())
61}
62
63pub fn boolean_type() -> Type {
64    Type::Boolean(HelpData::default())
65}
66
67pub fn record_type(params: &[(String, Type)]) -> Type {
68    let args = params
69        .iter()
70        .map(|param| ArgumentType::from(param.to_owned()))
71        .collect::<HashSet<_>>();
72    Type::Record(args, HelpData::default())
73}
74
75pub fn params_type() -> Type {
76    Type::Params(vec![], HelpData::default())
77}
78
79pub fn generic_function(s: &str) -> Lang {
80    let body = format!("{} <- function(x, ...) {{ UseMethod('{}') }}", s, s);
81    Lang::GenFunc(body, "".to_string(), HelpData::default())
82}
83
84pub fn tuple_type(types: &[Type]) -> Type {
85    Type::Tuple(types.to_vec(), HelpData::default())
86}
87
88pub fn array_type(i: Type, t: Type) -> Type {
89    Type::Vec(
90        VecType::Array,
91        Box::new(i),
92        Box::new(t),
93        HelpData::default(),
94    )
95}
96
97pub fn array_type2(i: i32, t: Type) -> Type {
98    let i2 = integer_type(i);
99    Type::Vec(
100        VecType::Array,
101        Box::new(i2),
102        Box::new(t),
103        HelpData::default(),
104    )
105}
106
107pub fn opaque_type(name: &str) -> Type {
108    Type::Opaque(name.to_string(), HelpData::default())
109}
110
111pub fn function_type(args: &[Type], return_type: Type) -> Type {
112    Type::Function(args.to_vec(), Box::new(return_type), HelpData::default())
113}
114
115pub fn interface_type(signatures: &[(&str, Type)]) -> Type {
116    let args = signatures
117        .iter()
118        .cloned()
119        .map(|(name, typ)| ArgumentType::from((name, typ)))
120        .collect::<HashSet<_>>();
121    Type::Interface(args, HelpData::default())
122}
123
124pub fn interface_type2(signatures: &[(String, Type)]) -> Type {
125    let args = signatures
126        .iter()
127        .cloned()
128        .map(|(name, typ)| ArgumentType::from((name, typ)))
129        .collect::<HashSet<_>>();
130    Type::Interface(args, HelpData::default())
131}
132
133pub fn intersection_type(types: &[Type]) -> Type {
134    let type_set = types.iter().cloned().collect::<HashSet<_>>();
135    Type::Intersection(type_set, HelpData::default())
136}
137
138pub fn union_type(types: &[Type]) -> Type {
139    types
140        .iter()
141        .cloned()
142        .reduce(|acc, t| {
143            Type::Operator(
144                TypeOperator::Union,
145                Box::new(acc),
146                Box::new(t),
147                HelpData::default(),
148            )
149        })
150        .unwrap_or(Type::Empty(HelpData::default()))
151}
152
153pub fn unknown_function_type() -> Type {
154    Type::UnknownFunction(HelpData::default())
155}
156
157pub fn operation(operator: Op, left: Lang, right: Lang) -> Lang {
158    Lang::Operator(
159        operator,
160        Box::new(left),
161        Box::new(right),
162        HelpData::default(),
163    )
164}
165
166pub fn let_var(name: &str, typ: Type) -> (Var, Type) {
167    (Var::from(name).set_type(typ.clone()), typ)
168}
169
170pub fn unmatching_return_type(typ1: &Type, typ2: &Type) -> TypRError {
171    TypRError::Type(TypeError::UnmatchingReturnType(
172        typ1.clone(),
173        typ2.clone(),
174    ))
175}