@@ -192,6 +192,26 @@ public struct BridgeJSLink {
192192 try renderImportedType ( importObjectBuilder : importObjectBuilder , type : type )
193193 }
194194 }
195+ importObjectBuilder . flushMergedTypeBlocks { [ self ] name , constructor , staticMethods in
196+ let dtsPrinter = CodeFragmentPrinter ( )
197+ dtsPrinter . write ( " \( name ) : { " )
198+ dtsPrinter . indent {
199+ if let constructor = constructor {
200+ let returnType = BridgeType . jsObject ( name )
201+ dtsPrinter . write (
202+ " new \( renderTSSignature ( parameters : constructor . parameters , returnType : returnType , effects : Effects ( isAsync : false , isThrows : false ) ) ) ; "
203+ )
204+ }
205+ for method in staticMethods {
206+ let methodName = method . jsName ?? method . name
207+ let signature =
208+ " \( renderTSPropertyName ( methodName ) ) \( renderTSSignature ( parameters : method . parameters , returnType : method . returnType , effects : Effects ( isAsync : false , isThrows : false ) ) ) ; "
209+ dtsPrinter . write ( signature )
210+ }
211+ }
212+ dtsPrinter . write ( " } " )
213+ return dtsPrinter . lines
214+ }
195215 data . importObjectBuilders . append ( importObjectBuilder )
196216 }
197217
@@ -2340,6 +2360,7 @@ extension BridgeJSLink {
23402360 var moduleName : String
23412361 private let importedPrinter : CodeFragmentPrinter = CodeFragmentPrinter ( )
23422362 private let dtsImportPrinter : CodeFragmentPrinter = CodeFragmentPrinter ( )
2363+ private var pendingImportedTypeBlocks : [ ( name : String , constructor : ImportedConstructorSkeleton ? , staticMethods : [ ImportedFunctionSkeleton ] ) ] = [ ]
23432364 var importedLines : [ String ] {
23442365 importedPrinter . lines
23452366 }
@@ -2364,6 +2385,29 @@ extension BridgeJSLink {
23642385 func appendDts ( _ lines : [ String ] ) {
23652386 dtsImportPrinter . write ( lines : lines )
23662387 }
2388+
2389+ func recordTypeBlock ( type : ImportedTypeSkeleton ) {
2390+ guard type . from == nil , type . constructor != nil || ! type . staticMethods . isEmpty else { return }
2391+ pendingImportedTypeBlocks . append ( ( type . name , type . constructor , type . staticMethods ) )
2392+ }
2393+
2394+ func flushMergedTypeBlocks (
2395+ render : ( String , ImportedConstructorSkeleton ? , [ ImportedFunctionSkeleton ] ) -> [ String ]
2396+ ) {
2397+ let grouped = Dictionary ( grouping : pendingImportedTypeBlocks , by : \. name )
2398+ for ( name , entries ) in grouped . sorted ( by : { $0 . key < $1 . key } ) {
2399+ let constructor = entries . lazy . compactMap ( \. constructor ) . first
2400+ var seenMethods = Set < String > ( )
2401+ let staticMethods = entries . flatMap ( \. staticMethods ) . filter { method in
2402+ let key = method . jsName ?? method . name
2403+ guard ! seenMethods . contains ( key ) else { return false }
2404+ seenMethods . insert ( key )
2405+ return true
2406+ }
2407+ appendDts ( render ( name , constructor , staticMethods ) )
2408+ }
2409+ pendingImportedTypeBlocks = [ ]
2410+ }
23672411 }
23682412
23692413 struct NamespaceBuilder {
@@ -3144,26 +3188,7 @@ extension BridgeJSLink {
31443188 importObjectBuilder . assignToImportObject ( name : abiName , function : js )
31453189 importObjectBuilder . appendDts ( dts )
31463190 }
3147- if type . from == nil , type . constructor != nil || ! type . staticMethods . isEmpty {
3148- let dtsPrinter = CodeFragmentPrinter ( )
3149- dtsPrinter . write ( " \( type . name ) : { " )
3150- dtsPrinter . indent {
3151- if let constructor = type . constructor {
3152- let returnType = BridgeType . jsObject ( type . name )
3153- dtsPrinter . write (
3154- " new \( renderTSSignature ( parameters : constructor . parameters , returnType : returnType , effects : Effects ( isAsync : false , isThrows : false ) ) ) ; "
3155- )
3156- }
3157- for method in type . staticMethods {
3158- let methodName = method . jsName ?? method . name
3159- let signature =
3160- " \( renderTSPropertyName ( methodName ) ) \( renderTSSignature ( parameters : method . parameters , returnType : method . returnType , effects : Effects ( isAsync : false , isThrows : false ) ) ) ; "
3161- dtsPrinter . write ( signature )
3162- }
3163- }
3164- dtsPrinter . write ( " } " )
3165- importObjectBuilder . appendDts ( dtsPrinter . lines )
3166- }
3191+ importObjectBuilder . recordTypeBlock ( type : type )
31673192 for method in type . methods {
31683193 let ( js , dts ) = try renderImportedMethod ( context : type , method : method )
31693194 importObjectBuilder . assignToImportObject ( name : method . abiName ( context : type ) , function : js )
0 commit comments