teo_parser/ast/
argument.rs1use 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}