@@ -146,12 +146,6 @@ struct BridgeJSLink {
146
146
147
147
// Process functions
148
148
for function in skeleton. functions {
149
- if function. effects. isStatic,
150
- case . enumName( _) = function. staticContext
151
- {
152
- continue
153
- }
154
-
155
149
var ( js, dts) = try renderExportedFunction ( function: function)
156
150
157
151
if function. effects. isStatic,
@@ -195,17 +189,110 @@ struct BridgeJSLink {
195
189
}
196
190
197
191
for enumDefinition in skeleton. enums where enumDefinition. enumType != . namespace {
192
+ // Process enum static methods to add to Exports type
193
+ let enumExportPrinter = CodeFragmentPrinter ( )
194
+ let enumDtsPrinter = CodeFragmentPrinter ( )
195
+
198
196
for function in enumDefinition. staticMethods {
199
- let assignmentJs = try renderEnumStaticFunctionAssignment (
200
- function: function,
201
- enumName: enumDefinition. name
197
+ let thunkBuilder = ExportedThunkBuilder ( effects: function. effects)
198
+ for param in function. parameters {
199
+ try thunkBuilder. lowerParameter ( param: param)
200
+ }
201
+ let returnExpr = try thunkBuilder. call ( abiName: function. abiName, returnType: function. returnType)
202
+
203
+ let methodPrinter = CodeFragmentPrinter ( )
204
+ methodPrinter. write ( " \( function. name) : function( \( function. parameters. map { $0. name } . joined ( separator: " , " ) ) ) { " )
205
+ methodPrinter. indent {
206
+ methodPrinter. write ( contentsOf: thunkBuilder. body)
207
+ methodPrinter. write ( contentsOf: thunkBuilder. cleanupCode)
208
+ methodPrinter. write ( lines: thunkBuilder. checkExceptionLines ( ) )
209
+ if let returnExpr = returnExpr {
210
+ methodPrinter. write ( " return \( returnExpr) ; " )
211
+ }
212
+ }
213
+ methodPrinter. write ( " }, " )
214
+
215
+ enumExportPrinter. write ( lines: methodPrinter. lines)
216
+ enumDtsPrinter. write ( " \( function. name) \( renderTSSignature ( parameters: function. parameters, returnType: function. returnType, effects: function. effects) ) ; " )
217
+ }
218
+
219
+ let enumExportLines = enumExportPrinter. lines
220
+ let enumDtsLines = enumDtsPrinter. lines
221
+
222
+ let enumPropertyPrinter = CodeFragmentPrinter ( )
223
+ let enumPropertyDtsPrinter = CodeFragmentPrinter ( )
224
+
225
+ for property in enumDefinition. staticProperties {
226
+ let readonly = property. isReadonly ? " readonly " : " "
227
+ enumPropertyDtsPrinter. write ( " \( readonly) \( property. name) : \( property. type. tsType) ; " )
228
+
229
+ let getterThunkBuilder = ExportedThunkBuilder ( effects: Effects ( isAsync: false , isThrows: false ) )
230
+ let getterReturnExpr = try getterThunkBuilder. call (
231
+ abiName: property. getterAbiName ( ) ,
232
+ returnType: property. type
202
233
)
203
- data. enumStaticAssignments. append ( contentsOf: assignmentJs)
234
+
235
+ enumPropertyPrinter. write ( " get \( property. name) () { " )
236
+ enumPropertyPrinter. indent {
237
+ enumPropertyPrinter. write ( contentsOf: getterThunkBuilder. body)
238
+ enumPropertyPrinter. write ( contentsOf: getterThunkBuilder. cleanupCode)
239
+ enumPropertyPrinter. write ( lines: getterThunkBuilder. checkExceptionLines ( ) )
240
+ if let returnExpr = getterReturnExpr {
241
+ enumPropertyPrinter. write ( " return \( returnExpr) ; " )
242
+ }
243
+ }
244
+ enumPropertyPrinter. write ( " }, " )
245
+
246
+ if !property. isReadonly {
247
+ let setterThunkBuilder = ExportedThunkBuilder ( effects: Effects ( isAsync: false , isThrows: false ) )
248
+ try setterThunkBuilder. lowerParameter (
249
+ param: Parameter ( label: " value " , name: " value " , type: property. type)
250
+ )
251
+ _ = try setterThunkBuilder. call (
252
+ abiName: property. setterAbiName ( ) ,
253
+ returnType: . void
254
+ )
255
+
256
+ enumPropertyPrinter. write ( " set \( property. name) (value) { " )
257
+ enumPropertyPrinter. indent {
258
+ enumPropertyPrinter. write ( contentsOf: setterThunkBuilder. body)
259
+ enumPropertyPrinter. write ( contentsOf: setterThunkBuilder. cleanupCode)
260
+ enumPropertyPrinter. write ( lines: setterThunkBuilder. checkExceptionLines ( ) )
261
+ }
262
+ enumPropertyPrinter. write ( " }, " )
263
+ }
204
264
}
205
- for property in enumDefinition. staticProperties {
206
- let ( propJs, _) = try renderEnumStaticProperty ( property: property, enumName: enumDefinition. name)
207
- data. enumStaticAssignments. append ( contentsOf: propJs)
265
+
266
+ let enumPropertyLines = enumPropertyPrinter. lines
267
+ let enumPropertyDtsLines = enumPropertyDtsPrinter. lines
268
+
269
+ if !enumExportLines. isEmpty || !enumPropertyLines. isEmpty {
270
+ let exportsPrinter = CodeFragmentPrinter ( )
271
+ let dtsExportsPrinter = CodeFragmentPrinter ( )
272
+
273
+ exportsPrinter. write ( " \( enumDefinition. name) : { " )
274
+ exportsPrinter. indent {
275
+ // Combine all lines and handle trailing comma removal
276
+ var allLines = enumExportLines + enumPropertyLines
277
+ if let lastLineIndex = allLines. indices. last, allLines [ lastLineIndex] . hasSuffix ( " , " ) {
278
+ allLines [ lastLineIndex] = String ( allLines [ lastLineIndex] . dropLast ( ) )
279
+ }
280
+ exportsPrinter. write ( lines: allLines)
281
+ }
282
+ exportsPrinter. write ( " }, " )
283
+
284
+ dtsExportsPrinter. write ( " \( enumDefinition. name) : { " )
285
+ dtsExportsPrinter. indent {
286
+ dtsExportsPrinter. write ( lines: enumDtsLines)
287
+ dtsExportsPrinter. write ( lines: enumPropertyDtsLines)
288
+ }
289
+ dtsExportsPrinter. write ( " } " )
290
+
291
+ data. exportsLines. append ( contentsOf: exportsPrinter. lines)
292
+ data. dtsExportLines. append ( contentsOf: dtsExportsPrinter. lines)
208
293
}
294
+
295
+ // Static properties are now handled in Exports type - no global assignments needed
209
296
}
210
297
211
298
}
@@ -994,8 +1081,6 @@ struct BridgeJSLink {
994
1081
private func generateDeclarations( enumDefinition: ExportedEnum ) -> [ String ] {
995
1082
let printer = CodeFragmentPrinter ( )
996
1083
997
- let enumStaticFunctions = enumDefinition. staticMethods
998
-
999
1084
switch enumDefinition. emitStyle {
1000
1085
case . tsEnum:
1001
1086
switch enumDefinition. enumType {
@@ -1035,22 +1120,10 @@ struct BridgeJSLink {
1035
1120
printer. write ( " readonly \( caseName) : \( value) ; " )
1036
1121
}
1037
1122
1038
- for function in enumStaticFunctions {
1039
- let signature = renderTSSignature (
1040
- parameters: function. parameters,
1041
- returnType: function. returnType,
1042
- effects: function. effects
1043
- )
1044
- printer. write ( " \( function. name) \( signature) ; " )
1045
- }
1046
- for property in enumDefinition. staticProperties {
1047
- let readonly = property. isReadonly ? " readonly " : " "
1048
- printer. write ( " \( readonly) \( property. name) : \( property. type. tsType) ; " )
1049
- }
1050
1123
}
1051
1124
printer. write ( " }; " )
1052
1125
printer. write (
1053
- " export type \( enumDefinition. name) = typeof \( enumDefinition. name) [keyof typeof \( enumDefinition. name) ]; "
1126
+ " export type \( enumDefinition. name) Tag = typeof \( enumDefinition. name) [keyof typeof \( enumDefinition. name) ]; "
1054
1127
)
1055
1128
printer. nextLine ( )
1056
1129
case . associatedValue:
@@ -1064,18 +1137,6 @@ struct BridgeJSLink {
1064
1137
}
1065
1138
printer. write ( " }; " )
1066
1139
1067
- for function in enumStaticFunctions {
1068
- let signature = renderTSSignature (
1069
- parameters: function. parameters,
1070
- returnType: function. returnType,
1071
- effects: function. effects
1072
- )
1073
- printer. write ( " \( function. name) \( signature) ; " )
1074
- }
1075
- for property in enumDefinition. staticProperties {
1076
- let readonly = property. isReadonly ? " readonly " : " "
1077
- printer. write ( " \( readonly) \( property. name) : \( property. type. tsType) ; " )
1078
- }
1079
1140
}
1080
1141
printer. write ( " }; " )
1081
1142
printer. nextLine ( )
0 commit comments