kodept_ast/node/
types.rs

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}