teo_parser/ast/
argument_list_declaration.rs1use crate::{declare_container_node, impl_container_node_defaults, node_children_iter, node_children_iter_fn};
2use crate::ast::argument_declaration::ArgumentDeclaration;
3use crate::ast::partial_argument_declaration::PartialArgumentDeclaration;
4use crate::format::Writer;
5use crate::traits::resolved::Resolve;
6use crate::traits::write::Write;
7
8declare_container_node!(ArgumentListDeclaration,
9    pub(crate) argument_declarations: Vec<usize>,
10    pub(crate) partial_argument_declarations: Vec<usize>,
11);
12
13impl_container_node_defaults!(ArgumentListDeclaration);
14
15node_children_iter!(
16    ArgumentListDeclaration,
17    ArgumentDeclaration,
18    ArgumentDeclarationsIter,
19    argument_declarations
20);
21
22node_children_iter!(
23    ArgumentListDeclaration,
24    PartialArgumentDeclaration,
25    PartialArgumentDeclarationsIter,
26    partial_argument_declarations
27);
28
29impl ArgumentListDeclaration {
30
31    node_children_iter_fn!(argument_declarations, ArgumentDeclarationsIter);
32
33    node_children_iter_fn!(partial_argument_declarations, PartialArgumentDeclarationsIter);
34
35    pub fn every_argument_is_optional(&self) -> bool {
36        for argument_declaration in self.argument_declarations() {
37            if !argument_declaration.type_expr().resolved().is_optional() {
38                return false
39            }
40        }
41        true
42    }
43
44    pub fn get(&self, name: &str) -> Option<&ArgumentDeclaration> {
45        self.argument_declarations().find(|d| d.name().name() == name)
46    }
47}
48
49impl Write for ArgumentListDeclaration {
50    fn write<'a>(&'a self, writer: &mut Writer<'a>) {
51        writer.write_children(self, self.children.values());
52    }
53}