kodept_ast/node/
file.rs

1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3
4use kodept_core::structure::rlt::{File, Module};
5use kodept_core::structure::span::CodeHolder;
6
7use crate::graph::{NodeId, SyntaxTreeBuilder};
8use crate::traits::Linker;
9use crate::traits::PopulateTree;
10use crate::{node, TopLevel};
11
12#[derive(Debug, PartialEq, Clone)]
13#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
14pub enum ModuleKind {
15    Global,
16    Ordinary,
17}
18
19node! {
20    #[derive(Debug, PartialEq)]
21    #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
22    pub struct FileDecl {
23        ;
24        pub modules: Vec<ModDecl>,
25    }
26}
27
28node! {
29    #[derive(Debug, PartialEq)]
30    #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
31    pub struct ModDecl {
32        pub kind: ModuleKind,
33        pub name: String,;
34        pub contents: Vec<TopLevel>,
35    }
36}
37
38impl PopulateTree for File {
39    type Output = FileDecl;
40
41    fn convert(
42        &self,
43        builder: &mut SyntaxTreeBuilder,
44        context: &mut (impl Linker + CodeHolder),
45    ) -> NodeId<Self::Output> {
46        builder
47            .add_node(FileDecl::uninit())
48            .with_children_from(self.0.iter(), context)
49            .with_rlt(context, self)
50            .id()
51    }
52}
53
54impl PopulateTree for Module {
55    type Output = ModDecl;
56
57    fn convert(
58        &self,
59        builder: &mut SyntaxTreeBuilder,
60        context: &mut (impl Linker + CodeHolder),
61    ) -> NodeId<Self::Output> {
62        let (kind, name, rest) = match self {
63            Module::Global { id, rest, .. } => (ModuleKind::Global, id, rest),
64            Module::Ordinary { id, rest, .. } => (ModuleKind::Ordinary, id, rest),
65        };
66        let node = ModDecl::uninit(kind, context.get_chunk_located(name).to_string());
67        builder
68            .add_node(node)
69            .with_children_from(rest.iter(), context)
70            .with_rlt(context, self)
71            .id()
72    }
73}