kodept_ast/node/
function.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::{NodeId};
8use crate::graph::{Identity, SyntaxTreeBuilder};
9use crate::traits::Linker;
10use crate::traits::PopulateTree;
11use crate::{node, Body, Type, TyParam, node_sub_enum, Param};
12
13node_sub_enum! {
14    #[derive(Debug, PartialEq)]
15    #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16    pub enum FnDecl {
17        Body(BodyFnDecl),
18        Abst(AbstFnDecl)
19    }
20}
21
22node! {
23    #[derive(Debug, PartialEq)]
24    #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
25    pub struct BodyFnDecl {
26        pub name: String,;
27        pub parameters: Vec<Param>,
28        pub return_type: Option<Type>,
29        pub body: Identity<Body>,
30    }
31}
32
33node! {
34    #[derive(Debug, PartialEq)]
35    #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
36    pub struct AbstFnDecl {
37        pub name: String,;
38        pub parameters: Vec<TyParam>,
39        pub return_type: Option<Type>,
40    }
41}
42
43impl PopulateTree for rlt::BodiedFunction {
44    type Output = BodyFnDecl;
45
46    fn convert(
47        &self,
48        builder: &mut SyntaxTreeBuilder,
49        context: &mut (impl Linker + CodeHolder),
50    ) -> NodeId<Self::Output> {
51        builder
52            .add_node(BodyFnDecl::uninit(
53                context.get_chunk_located(&self.id).to_string(),
54            ))
55            .with_children_from(self.return_type.as_ref().map(|x| &x.1), context)
56            .with_children_from(self.params.iter().flat_map(|x| x.inner.as_ref()), context)
57            .with_children_from([self.body.as_ref()], context)
58            .with_rlt(context, self)
59            .id()
60    }
61}