1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
//! Enum-related IR types for TypeScript enum declarations.
//!
//! This module provides the intermediate representation for TypeScript enums,
//! including both numeric and string enums.
//!
//! ## Example
//!
//! Given this TypeScript enum:
//!
//! ```typescript
//! /** @derive(Debug) */
//! enum Status {
//! /** @default */
//! Active = "ACTIVE",
//! Inactive = "INACTIVE",
//! Pending = 0,
//! }
//! ```
//!
//! The resulting [`EnumIR`] would contain:
//! - `name`: `"Status"`
//! - `variants`: Three [`EnumVariantIR`] entries with different [`EnumValue`] types
use ;
use crate;
/// Represents the value/initializer of an enum variant.
///
/// TypeScript enums can have various types of initializers:
/// - String literals: `Status = "ACTIVE"`
/// - Numeric literals: `Priority = 1`
/// - Auto-incremented (no initializer): `First,`
/// - Computed expressions: `Value = CONST + 1`
///
/// # Examples
///
/// ```typescript
/// enum Example {
/// A, // EnumValue::Auto
/// B = 10, // EnumValue::Number(10.0)
/// C = "hello", // EnumValue::String("hello")
/// D = A + B, // EnumValue::Expr("A + B")
/// }
/// ```
/// Intermediate representation of a TypeScript enum declaration.
///
/// Represents both regular enums and `const` enums. Captures all variants
/// with their names, values, and any decorators.
///
/// # Const Enums
///
/// When `is_const` is `true`, the enum is declared with `const enum`.
/// Const enums are completely inlined at compile time and don't exist
/// at runtime.
///
/// # Example
///
/// ```rust,no_run
/// use macroforge_ts_syn::{EnumIR, EnumValue};
///
/// fn is_string_enum(enum_ir: &EnumIR) -> bool {
/// enum_ir.variants.iter().all(|v| v.value.is_string())
/// }
///
/// fn generate_values_array(enum_ir: &EnumIR) -> String {
/// let values: Vec<String> = enum_ir.variants.iter()
/// .map(|v| format!("{}.{}", enum_ir.name, v.name))
/// .collect();
///
/// format!("const {}Values = [{}] as const;",
/// enum_ir.name,
/// values.join(", ")
/// )
/// }
/// ```
/// Intermediate representation of an enum variant/member.
///
/// Each variant has a name, optional initializer value, and can have
/// decorators applied via JSDoc comments.
///
/// # Example
///
/// For the TypeScript enum variant:
///
/// ```typescript
/// /** @default */
/// Active = "ACTIVE",
/// ```
///
/// The `EnumVariantIR` would have:
/// - `name`: `"Active"`
/// - `value`: `EnumValue::String("ACTIVE")`
/// - `decorators`: Contains the `@default` decorator