teo_parser/ast/
argument.rs

1use std::cell::RefCell;
2use crate::ast::expression::Expression;
3use crate::ast::identifier::Identifier;
4use crate::{declare_container_node, impl_container_node_defaults, node_child_fn, node_optional_child_fn};
5use crate::format::Writer;
6use crate::r#type::r#type::Type;
7use crate::traits::node_trait::NodeTrait;
8use crate::traits::resolved::Resolve;
9use crate::traits::write::Write;
10
11declare_container_node!(
12    Argument,
13    pub(crate) name: Option<usize>,
14    pub(crate) value: usize,
15    pub(crate) resolved: RefCell<Option<ArgumentResolved>>
16);
17
18impl_container_node_defaults!(Argument);
19
20impl Argument {
21
22    node_optional_child_fn!(name, Identifier);
23
24    node_child_fn!(value, Expression);
25
26    pub fn get_type(&self) -> &Type {
27        &self.value().resolved().r#type
28    }
29
30    pub fn resolve(&self, resolved: ArgumentResolved) {
31        *(unsafe { &mut *self.resolved.as_ptr() }) = Some(resolved);
32    }
33
34    pub fn resolved(&self) -> &ArgumentResolved {
35        (unsafe { &*self.resolved.as_ptr() }).as_ref().unwrap()
36    }
37
38    pub fn is_resolved(&self) -> bool {
39        self.resolved.borrow().is_some()
40    }
41
42    pub fn resolved_name(&self) -> Option<&str> {
43        if let Some(name) = self.name() {
44            Some(name.name())
45        } else {
46            if self.is_resolved() {
47                Some(self.resolved().name.as_str())
48            } else {
49                None
50            }
51        }
52    }
53}
54
55#[derive(Debug)]
56pub struct ArgumentResolved {
57    pub name: String,
58    pub expect: Type,
59    pub completion_expect: Option<Type>,
60}
61
62impl Write for Argument {
63    fn write<'a>(&'a self, writer: &mut Writer<'a>) {
64        writer.write_children(self, self.children.values());
65    }
66}