oxur_comp/
lowering.rs

1//! Stage 3: Lower
2//!
3//! Converts Core Forms into Rust AST using the syn crate.
4
5use crate::Result;
6use oxur_lang::{CoreForm, NodeId};
7use std::collections::HashMap;
8
9/// Lowerer converts Core Forms to Rust AST
10pub struct Lowerer {
11    #[allow(dead_code)]
12    node_map: HashMap<NodeId, syn::Expr>,
13}
14
15impl Lowerer {
16    pub fn new() -> Self {
17        Self { node_map: HashMap::new() }
18    }
19
20    /// Lower Core Forms to Rust AST
21    pub fn lower(&mut self, _forms: Vec<CoreForm>) -> Result<syn::File> {
22        // Placeholder implementation
23        Ok(syn::File { shebang: None, attrs: vec![], items: vec![] })
24    }
25}
26
27impl Default for Lowerer {
28    fn default() -> Self {
29        Self::new()
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn test_lowerer_creation() {
39        let lowerer = Lowerer::new();
40        assert_eq!(lowerer.node_map.len(), 0);
41    }
42
43    #[test]
44    fn test_lowerer_default() {
45        let lowerer = Lowerer::default();
46        assert_eq!(lowerer.node_map.len(), 0);
47    }
48
49    #[test]
50    fn test_lower_empty() {
51        let mut lowerer = Lowerer::new();
52        let result = lowerer.lower(vec![]);
53        assert!(result.is_ok());
54        let file = result.unwrap();
55        assert_eq!(file.items.len(), 0);
56    }
57
58    #[test]
59    fn test_lower_returns_syn_file() {
60        let mut lowerer = Lowerer::new();
61        let result = lowerer.lower(vec![]);
62        assert!(result.is_ok());
63        let file = result.unwrap();
64        assert!(file.shebang.is_none());
65        assert_eq!(file.attrs.len(), 0);
66    }
67}