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}