teo_parser/ast/
generics.rs

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