@@ -146,12 +146,6 @@ struct BridgeJSLink {
146146
147147 // Process functions
148148 for function in skeleton. functions {
149- if function. effects. isStatic,
150- case . enumName( _) = function. staticContext
151- {
152- continue
153- }
154- 155149 var ( js, dts) = try renderExportedFunction ( function: function)
156150
157151 if function. effects. isStatic,
@@ -195,17 +189,110 @@ struct BridgeJSLink {
195189 }
196190
197191 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+ 198196 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
202233 )
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+ }
204264 }
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)
208293 }
294+ 295+ // Static properties are now handled in Exports type - no global assignments needed
209296 }
210297
211298 }
@@ -994,8 +1081,6 @@ struct BridgeJSLink {
9941081 private func generateDeclarations( enumDefinition: ExportedEnum ) -> [ String ] {
9951082 let printer = CodeFragmentPrinter ( )
9961083
997- let enumStaticFunctions = enumDefinition. staticMethods
998- 9991084 switch enumDefinition. emitStyle {
10001085 case . tsEnum:
10011086 switch enumDefinition. enumType {
@@ -1035,22 +1120,10 @@ struct BridgeJSLink {
10351120 printer. write ( " readonly \( caseName) : \( value) ; " )
10361121 }
10371122
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- }
10501123 }
10511124 printer. write ( " }; " )
10521125 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) ]; "
10541127 )
10551128 printer. nextLine ( )
10561129 case . associatedValue:
@@ -1064,18 +1137,6 @@ struct BridgeJSLink {
10641137 }
10651138 printer. write ( " }; " )
10661139
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- }
10791140 }
10801141 printer. write ( " }; " )
10811142 printer. nextLine ( )
0 commit comments