1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3
4use kodept_core::structure::rlt;
5use kodept_core::structure::span::CodeHolder;
6
7use crate::graph::Identity;
8use crate::graph::NodeId;
9use crate::graph::{SyntaxTreeBuilder};
10use crate::traits::{AsEnum, Linker, PopulateTree};
11use crate::{node, node_sub_enum};
12
13node_sub_enum! {
14 #[derive(Debug, PartialEq)]
15 #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
16 pub enum Type {
17 TyName(TyName),
18 Tuple(ProdTy)
19 }
20}
21
22node_sub_enum! {
23 #[derive(Debug, PartialEq)]
24 #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
25 pub enum Param {
26 Ty(TyParam),
27 NonTy(NonTyParam)
28 }
29}
30
31node! {
32 #[derive(Debug, PartialEq)]
33 #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
34 pub struct TyName {
35 pub name: String,;
36 }
37}
38
39node! {
40 #[derive(Debug, PartialEq)]
41 #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
42 pub struct ProdTy {;
43 pub types: Vec<Type>,
44 }
45}
46
47node! {
48 #[derive(Debug, PartialEq)]
49 #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
50 pub struct TyParam {
51 pub name: String,;
52 pub parameter_type: Identity<Type>,
53 }
54}
55
56node! {
57 #[derive(Debug, PartialEq)]
58 #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
59 pub struct NonTyParam {
60 pub name: String,;
61 }
62}
63
64impl Param {
65 pub fn name(&self) -> &str {
66 match self.as_enum() {
67 ParamEnum::Ty(x) => &x.name,
68 ParamEnum::NonTy(x) => &x.name
69 }
70 }
71}
72
73impl PopulateTree for rlt::new_types::TypeName {
74 type Output = TyName;
75
76 fn convert(
77 &self,
78 builder: &mut SyntaxTreeBuilder,
79 context: &mut (impl Linker + CodeHolder),
80 ) -> NodeId<Self::Output> {
81 let node = TyName::uninit(context.get_chunk_located(self).to_string());
82
83 builder.add_node(node).with_rlt(context, self).id()
84 }
85}
86
87impl PopulateTree for rlt::TypedParameter {
88 type Output = TyParam;
89
90 fn convert(
91 &self,
92 builder: &mut SyntaxTreeBuilder,
93 context: &mut (impl Linker + CodeHolder),
94 ) -> NodeId<Self::Output> {
95 let node = TyParam::uninit(context.get_chunk_located(&self.id).to_string());
96 builder
97 .add_node(node)
98 .with_children_from([&self.parameter_type], context)
99 .with_rlt(context, self)
100 .id()
101 }
102}
103
104impl PopulateTree for rlt::Type {
105 type Output = Type;
106
107 fn convert(
108 &self,
109 builder: &mut SyntaxTreeBuilder,
110 context: &mut (impl Linker + CodeHolder),
111 ) -> NodeId<Self::Output> {
112 match self {
113 rlt::Type::Reference(x) => x.convert(builder, context).cast(),
114 rlt::Type::Tuple(x) => builder
115 .add_node(ProdTy::uninit())
116 .with_children_from(x.inner.iter().as_slice(), context)
117 .with_rlt(context, self)
118 .id()
119 .cast()
120 }
121 }
122}
123
124impl PopulateTree for rlt::UntypedParameter {
125 type Output = NonTyParam;
126
127 fn convert(
128 &self,
129 builder: &mut SyntaxTreeBuilder,
130 context: &mut (impl Linker + CodeHolder),
131 ) -> NodeId<Self::Output> {
132 builder
133 .add_node(NonTyParam::uninit(
134 context.get_chunk_located(&self.id).to_string(),
135 ))
136 .with_rlt(context, self)
137 .id()
138 }
139}
140
141impl PopulateTree for rlt::Parameter {
142 type Output = Param;
143
144 fn convert(
145 &self,
146 builder: &mut SyntaxTreeBuilder,
147 context: &mut (impl Linker + CodeHolder),
148 ) -> NodeId<Self::Output> {
149 match self {
150 rlt::Parameter::Typed(x) => x.convert(builder, context).cast(),
151 rlt::Parameter::Untyped(x) => x.convert(builder, context).cast(),
152 }
153 }
154}