1use crate::{Accessor, Data, Ident, InvokeRef, MacroInvokeRef, Type, ValueRef};
2
3#[derive(Debug, Clone)]
4pub(crate) enum ValueNode {
5 Tuple(Vec<ValueRef>),
6 Str(String),
7 Reference(ValueRef),
8 ReferenceMut(ValueRef),
9 Dereference(ValueRef),
10 Binding {
11 name: Ident,
12 ty: Type,
13 },
14 DataStructure {
15 name: String,
16 data: Data<ValueRef>,
17 },
18 Invoke(InvokeRef),
19 Destructure {
20 parent: ValueRef,
21 accessor: Accessor,
22 ty: Type,
23 },
24 MacroInvocation(MacroInvokeRef),
25}
26
27impl ValueNode {
28 pub fn get_type_name(&self) -> Self {
29 match self {
30 ValueNode::Tuple(types) => {
31 let types: String = types.iter().fold(String::new(), |mut acc, v| {
32 match &v.node().get_type_name() {
33 ValueNode::Str(name) => {
34 acc.push_str(name);
35 acc.push_str(", ");
36 acc
37 }
38 _ => unreachable!(),
39 }
40 });
41 let types = format!("({})", types.trim_end_matches(", "));
42 ValueNode::Str(types)
43 }
44 ValueNode::Str(_) => ValueNode::Str(String::from("str")),
45 ValueNode::DataStructure { name, .. } => ValueNode::Str(name.clone()),
46 ValueNode::Reference(v) => v.node().get_type_name(),
47 ValueNode::ReferenceMut(v) => v.node().get_type_name(),
48 ValueNode::Binding { ty, .. } => ValueNode::Str(ty.0.get_name()),
49 ValueNode::Destructure {
50 parent,
51 accessor,
52 ty,
53 } => ValueNode::Str(ty.0.get_name()),
54 node => panic!("ValueNode::get_type_name"),
55 }
56 }
57}