kodept_ast/node/
function.rs1#[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}