teo_parser/ast/
generics.rs1use std::collections::BTreeMap;
2use maplit::btreemap;
3use crate::ast::identifier::Identifier;
4use crate::ast::type_expr::TypeExpr;
5use crate::{declare_container_node, impl_container_node_defaults, node_child_fn, node_children_iter, node_children_iter_fn};
6use crate::format::Writer;
7use crate::r#type::Type;
8use crate::traits::write::Write;
9
10declare_container_node!(GenericsDeclaration,
11 pub(crate) identifiers: Vec<usize>,
12);
13
14impl_container_node_defaults!(GenericsDeclaration);
15
16node_children_iter!(GenericsDeclaration, Identifier, IdentifiersIter, identifiers);
17
18impl GenericsDeclaration {
19
20 node_children_iter_fn!(identifiers, IdentifiersIter);
21
22 pub fn names(&self) -> Vec<&str> {
23 self.identifiers().map(|i| i.name()).collect()
24 }
25
26 pub fn calculate_generics_map(&self, types: &Vec<Type>) -> BTreeMap<String, Type> {
27 if self.identifiers.len() == types.len() {
28 return self.identifiers().enumerate().map(|(index, identifier)| (identifier.name().to_owned(), types.get(index).unwrap().clone())).collect();
29 }
30 btreemap!{}
31 }
32}
33
34declare_container_node!(GenericsConstraint, pub(crate) items: Vec<usize>);
35
36impl_container_node_defaults!(GenericsConstraint);
37
38node_children_iter!(GenericsConstraint, GenericsConstraintItem, ItemsIter, items);
39
40impl GenericsConstraint {
41
42 node_children_iter_fn!(items, ItemsIter);
43}
44
45declare_container_node!(GenericsConstraintItem, pub(crate) identifier: usize, pub(crate) type_expr: usize);
46
47impl_container_node_defaults!(GenericsConstraintItem);
48
49impl GenericsConstraintItem {
50
51 node_child_fn!(identifier, Identifier);
52
53 node_child_fn!(type_expr, TypeExpr);
54}
55
56impl Write for GenericsDeclaration {
57 fn write<'a>(&'a self, writer: &mut Writer<'a>) {
58 writer.write_children(self, self.children.values())
59 }
60}
61
62impl Write for GenericsConstraint {
63 fn write<'a>(&'a self, writer: &mut Writer<'a>) {
64 writer.write_children(self, self.children.values())
65 }
66}
67
68impl Write for GenericsConstraintItem {
69 fn write<'a>(&'a self, writer: &mut Writer<'a>) {
70 writer.write_children(self, self.children.values())
71 }
72}