reluxscript/codegen/
mod.rs1mod babel;
6#[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#[derive(Debug, Clone, Copy, PartialEq, Eq)]
29pub enum Target {
30 Babel,
31 Swc,
32 Both,
33}
34
35#[derive(Debug)]
37pub struct GeneratedCode {
38 pub babel: Option<String>,
39 pub swc: Option<String>,
40}
41
42pub 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 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
67pub 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 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}