rolldown_runtime_helpers/
lib.rs1use std::collections::HashSet;
2use std::sync::atomic::{AtomicBool, Ordering};
3
4#[derive(Default, Debug)]
5pub struct RuntimeHelpers {
6 inner: Inner,
7}
8
9macro_rules! define_helpers {
10 (
11 Helpers {
12 $( $name:ident ( $( $declared:ident ),* ): ( $( $dep:ident ),* ), )*
13 }
14 ) => {
15
16 #[derive(Debug,Default)]
17 struct Inner {
18 $( $name: AtomicBool, )*
19 }
20
21 impl RuntimeHelpers {
22 pub fn extend_from(&self, other: &Self) {
23 $(
24 if other.inner.$name.load(Ordering::SeqCst) {
25 self.inner.$name.store(true, Ordering::Relaxed);
26 }
27 )*
28 }
29
30 pub fn generate_helpers(&self) -> Vec<&'static str> {
31 let mut to = vec![];
32 $(
33 if self.inner.$name.load(Ordering::Relaxed) {
34 to.push(include_str!(concat!(
35 "./snippets/_",
36 stringify!($name),
37 ".js"
38 )));
39 }
40 )*
41 to
42 }
43
44 pub fn is_used_any_helpers(&self) -> bool {
45 $(
46 if self.inner.$name.load(Ordering::Relaxed) {
47 return true;
48 }
49 )*
50 false
51 }
52
53 pub fn used_names(&self) -> HashSet<&'static str> {
54 let mut to = HashSet::new();
55 $(
56 if self.inner.$name.load(Ordering::Relaxed) {
57 $(
58 to.insert(stringify!($declared));
59 )*
60 }
61 )*
62 to
63 }
64
65 $(
66 pub fn $name(&self) {
67 self.inner.$name.store(true, Ordering::Relaxed);
68 $(
69 self.$dep();
70 )*
71 }
72 )*
73 }
74 };
75}
76
77impl RuntimeHelpers {
78 pub fn new() -> Self {
79 Self::default()
80 }
81}
82
83define_helpers!(Helpers {
84 merge_namespaces(_mergeNamespaces): (),
85});
86
87#[test]
88fn test() {
89 let helpers = RuntimeHelpers::new();
90 helpers.merge_namespaces();
91 assert!(helpers.used_names().contains("_mergeNamespaces"));
92 assert_eq!(
93 helpers.generate_helpers(),
94 vec![include_str!("./snippets/_merge_namespaces.js")]
95 );
96}