reluxscript/codegen/
mod.rs

1//! Code generation for ReluxScript
2//!
3//! Generates both Babel (JavaScript) and SWC (Rust) plugin code from ReluxScript AST.
4
5mod babel;
6// Temporarily using swc_stub.rs to test rewriter pipeline
7#[path = "swc_stub.rs"]
8mod swc;
9pub mod type_context;
10pub mod swc_patterns;
11pub mod swc_metadata;
12pub mod decorated_ast;
13pub mod swc_decorator;
14pub mod swc_rewriter;
15pub mod swc_emit;
16
17pub use babel::BabelGenerator;
18pub use swc::SwcGenerator;
19pub use type_context::{TypeContext, TypeEnvironment, SwcTypeKind};
20pub use swc_patterns::SwcPatternGenerator;
21pub use swc_metadata::*;
22pub use decorated_ast::*;
23pub use swc_decorator::SwcDecorator;
24pub use swc_rewriter::SwcRewriter;
25pub use swc_emit::SwcEmitter;
26
27/// Target platform for code generation
28#[derive(Debug, Clone, Copy, PartialEq, Eq)]
29pub enum Target {
30    Babel,
31    Swc,
32    Both,
33}
34
35/// Result of code generation
36#[derive(Debug)]
37pub struct GeneratedCode {
38    pub babel: Option<String>,
39    pub swc: Option<String>,
40}
41
42/// Generate code for the given target(s)
43pub fn generate(program: &crate::parser::Program, target: Target) -> GeneratedCode {
44    let babel = if target == Target::Babel || target == Target::Both {
45        Some(BabelGenerator::new().generate(program))
46    } else {
47        None
48    };
49
50    let swc = if target == Target::Swc || target == Target::Both {
51        // NEW 3-STAGE PIPELINE: Decorate → Rewrite → Emit
52        let mut decorator = SwcDecorator::new();
53        let decorated_program = decorator.decorate_program(program);
54
55        let mut rewriter = SwcRewriter::new();
56        let rewritten_program = rewriter.rewrite_program(decorated_program);
57
58        let mut emitter = SwcEmitter::new();
59        Some(emitter.emit_program(&rewritten_program))
60    } else {
61        None
62    };
63
64    GeneratedCode { babel, swc }
65}
66
67/// Generate code with semantic type information (for better type inference)
68pub fn generate_with_types(
69    program: &crate::parser::Program,
70    type_env: crate::semantic::TypeEnv,
71    target: Target,
72) -> GeneratedCode {
73    let babel = if target == Target::Babel || target == Target::Both {
74        Some(BabelGenerator::new().generate(program))
75    } else {
76        None
77    };
78
79    let swc = if target == Target::Swc || target == Target::Both {
80        // NEW 3-STAGE PIPELINE: Decorate (with types) → Rewrite → Emit
81        let mut decorator = SwcDecorator::with_semantic_types(type_env);
82        let decorated_program = decorator.decorate_program(program);
83
84        let mut rewriter = SwcRewriter::new();
85        let rewritten_program = rewriter.rewrite_program(decorated_program);
86
87        let mut emitter = SwcEmitter::new();
88        Some(emitter.emit_program(&rewritten_program))
89    } else {
90        None
91    };
92
93    GeneratedCode { babel, swc }
94}