@@ -80,6 +80,7 @@ public struct BridgeJSLink {
8080 var topLevelDtsTypeLines : [ String ] = [ ]
8181 var importObjectBuilders : [ ImportObjectBuilder ] = [ ]
8282 var enumStaticAssignments : [ String ] = [ ]
83+ var needsImportsObject : Bool = false
8384 }
8485
8586 private func collectLinkData ( ) throws -> LinkData {
@@ -173,12 +174,21 @@ public struct BridgeJSLink {
173174 let importObjectBuilder = ImportObjectBuilder ( moduleName : unified . moduleName )
174175 for fileSkeleton in imported . children {
175176 for getter in fileSkeleton . globalGetters {
177+ if getter . from == nil {
178+ data . needsImportsObject = true
179+ }
176180 try renderImportedGlobalGetter ( importObjectBuilder : importObjectBuilder , getter : getter )
177181 }
178182 for function in fileSkeleton . functions {
183+ if function . from == nil {
184+ data . needsImportsObject = true
185+ }
179186 try renderImportedFunction ( importObjectBuilder : importObjectBuilder , function : function )
180187 }
181188 for type in fileSkeleton . types {
189+ if type . constructor != nil , type . from == nil {
190+ data . needsImportsObject = true
191+ }
182192 try renderImportedType ( importObjectBuilder : importObjectBuilder , type : type )
183193 }
184194 }
@@ -294,7 +304,7 @@ public struct BridgeJSLink {
294304 }
295305 }
296306
297- private func generateAddImports ( ) -> CodeFragmentPrinter {
307+ private func generateAddImports ( needsImportsObject : Bool ) -> CodeFragmentPrinter {
298308 let printer = CodeFragmentPrinter ( )
299309 let allStructs = skeletons . compactMap { $0 . exported ? . structs } . flatMap { $0 }
300310 printer . write ( " return { " )
@@ -311,7 +321,7 @@ public struct BridgeJSLink {
311321 " bjs = {}; " ,
312322 " importObject[ \" bjs \" ] = bjs; " ,
313323 ] )
314- if skeletons . contains ( where : { $0 . imported != nil } ) {
324+ if needsImportsObject {
315325 printer . write ( lines : [
316326 " const imports = options.getImports(importsContext); "
317327 ] )
@@ -1043,7 +1053,7 @@ public struct BridgeJSLink {
10431053 printer . write ( lines : structPrinter . lines )
10441054 }
10451055 printer . nextLine ( )
1046- printer . write ( contentsOf : generateAddImports ( ) )
1056+ printer . write ( contentsOf : generateAddImports ( needsImportsObject : data . needsImportsObject ) )
10471057 }
10481058 printer . indent ( )
10491059
@@ -2176,11 +2186,15 @@ extension BridgeJSLink {
21762186 return printer . lines
21772187 }
21782188
2179- func call ( name : String , returnType : BridgeType ) throws -> String ? {
2180- let calleeExpr = Self . propertyAccessExpr ( objectExpr : " imports " , propertyName : name )
2189+ func call ( name : String , fromObjectExpr : String , returnType : BridgeType ) throws -> String ? {
2190+ let calleeExpr = Self . propertyAccessExpr ( objectExpr : fromObjectExpr , propertyName : name )
21812191 return try self . call ( calleeExpr : calleeExpr , returnType : returnType )
21822192 }
21832193
2194+ func call ( name : String , returnType : BridgeType ) throws -> String ? {
2195+ return try call ( name : name , fromObjectExpr : " imports " , returnType : returnType )
2196+ }
2197+
21842198 private func call ( calleeExpr : String , returnType : BridgeType ) throws -> String ? {
21852199 let callExpr = " \( calleeExpr ) ( \( parameterForwardings . joined ( separator : " , " ) ) ) "
21862200 return try self . call ( callExpr : callExpr , returnType : returnType )
@@ -2204,14 +2218,18 @@ extension BridgeJSLink {
22042218 )
22052219 }
22062220
2207- func callConstructor ( jsName : String , swiftTypeName : String ) throws -> String ? {
2208- let ctorExpr = Self . propertyAccessExpr ( objectExpr : " imports " , propertyName : jsName )
2221+ func callConstructor ( jsName : String , swiftTypeName : String , fromObjectExpr : String ) throws -> String ? {
2222+ let ctorExpr = Self . propertyAccessExpr ( objectExpr : fromObjectExpr , propertyName : jsName )
22092223 let call = " new \( ctorExpr ) ( \( parameterForwardings . joined ( separator : " , " ) ) ) "
22102224 let type : BridgeType = . jsObject ( swiftTypeName )
22112225 let loweringFragment = try IntrinsicJSFragment . lowerReturn ( type : type , context : context )
22122226 return try lowerReturnValue ( returnType : type , returnExpr : call , loweringFragment : loweringFragment )
22132227 }
22142228
2229+ func callConstructor ( jsName : String , swiftTypeName : String ) throws -> String ? {
2230+ return try callConstructor ( jsName : jsName , swiftTypeName : swiftTypeName , fromObjectExpr : " imports " )
2231+ }
2232+
22152233 func callMethod ( name : String , returnType : BridgeType ) throws -> String ? {
22162234 let objectExpr = " \( JSGlueVariableScope . reservedSwift ) .memory.getObject(self) "
22172235 let calleeExpr = Self . propertyAccessExpr ( objectExpr : objectExpr , propertyName : name )
@@ -2253,14 +2271,13 @@ extension BridgeJSLink {
22532271 body . write ( " \( call ) ; " )
22542272 }
22552273
2256- func getImportProperty ( name : String , returnType : BridgeType ) throws -> String ? {
2274+ func getImportProperty ( name : String , fromObjectExpr : String , returnType : BridgeType ) throws -> String ? {
22572275 if returnType == . void {
22582276 throw BridgeJSLinkError ( message : " Void is not supported for imported JS properties " )
22592277 }
22602278
22612279 let loweringFragment = try IntrinsicJSFragment . lowerReturn ( type : returnType , context : context )
2262- let escapedName = BridgeJSLink . escapeForJavaScriptStringLiteral ( name )
2263- let expr = " imports[ \" \( escapedName ) \" ] "
2280+ let expr = Self . propertyAccessExpr ( objectExpr : fromObjectExpr , propertyName : name )
22642281
22652282 let returnExpr : String ?
22662283 if loweringFragment . parameters . count == 0 {
@@ -2279,6 +2296,10 @@ extension BridgeJSLink {
22792296 )
22802297 }
22812298
2299+ func getImportProperty ( name : String , returnType : BridgeType ) throws -> String ? {
2300+ return try getImportProperty ( name : name , fromObjectExpr : " imports " , returnType : returnType )
2301+ }
2302+
22822303 private func lowerReturnValue (
22832304 returnType : BridgeType ,
22842305 returnExpr : String ? ,
@@ -3013,18 +3034,25 @@ extension BridgeJSLink {
30133034 try thunkBuilder . liftParameter ( param : param )
30143035 }
30153036 let jsName = function . jsName ?? function . name
3016- let returnExpr = try thunkBuilder . call ( name : jsName , returnType : function . returnType )
3037+ let importRootExpr = function . from == . global ? " globalThis " : " imports "
3038+ let returnExpr = try thunkBuilder . call (
3039+ name : jsName ,
3040+ fromObjectExpr : importRootExpr ,
3041+ returnType : function . returnType
3042+ )
30173043 let funcLines = thunkBuilder . renderFunction (
30183044 name : function . abiName ( context : nil ) ,
30193045 returnExpr : returnExpr ,
30203046 returnType : function . returnType
30213047 )
30223048 let effects = Effects ( isAsync : false , isThrows : false )
3023- importObjectBuilder . appendDts (
3024- [
3025- " \( renderTSPropertyName ( jsName ) ) \( renderTSSignature ( parameters : function . parameters , returnType : function . returnType , effects : effects ) ) ; "
3026- ]
3027- )
3049+ if function . from == nil {
3050+ importObjectBuilder . appendDts (
3051+ [
3052+ " \( renderTSPropertyName ( jsName ) ) \( renderTSSignature ( parameters : function . parameters , returnType : function . returnType , effects : effects ) ) ; "
3053+ ]
3054+ )
3055+ }
30283056 importObjectBuilder . assignToImportObject ( name : function . abiName ( context : nil ) , function : funcLines )
30293057 }
30303058
@@ -3034,14 +3062,21 @@ extension BridgeJSLink {
30343062 ) throws {
30353063 let thunkBuilder = ImportedThunkBuilder ( )
30363064 let jsName = getter . jsName ?? getter . name
3037- let returnExpr = try thunkBuilder . getImportProperty ( name : jsName , returnType : getter . type )
3065+ let importRootExpr = getter . from == . global ? " globalThis " : " imports "
3066+ let returnExpr = try thunkBuilder . getImportProperty (
3067+ name : jsName ,
3068+ fromObjectExpr : importRootExpr ,
3069+ returnType : getter . type
3070+ )
30383071 let abiName = getter . abiName ( context : nil )
30393072 let funcLines = thunkBuilder . renderFunction (
30403073 name : abiName ,
30413074 returnExpr : returnExpr ,
30423075 returnType : getter . type
30433076 )
3044- importObjectBuilder . appendDts ( [ " readonly \( renderTSPropertyName ( jsName ) ) : \( getter . type . tsType ) ; " ] )
3077+ if getter . from == nil {
3078+ importObjectBuilder . appendDts ( [ " readonly \( renderTSPropertyName ( jsName ) ) : \( getter . type . tsType ) ; " ] )
3079+ }
30453080 importObjectBuilder . assignToImportObject ( name : abiName , function : funcLines )
30463081 }
30473082
@@ -3105,7 +3140,12 @@ extension BridgeJSLink {
31053140 try thunkBuilder . liftParameter ( param : param )
31063141 }
31073142 let returnType = BridgeType . jsObject ( type . name )
3108- let returnExpr = try thunkBuilder . callConstructor ( jsName : type . jsName ?? type . name , swiftTypeName : type . name )
3143+ let importRootExpr = type . from == . global ? " globalThis " : " imports "
3144+ let returnExpr = try thunkBuilder . callConstructor (
3145+ jsName : type . jsName ?? type . name ,
3146+ swiftTypeName : type . name ,
3147+ fromObjectExpr : importRootExpr
3148+ )
31093149 let abiName = constructor . abiName ( context : type )
31103150 let funcLines = thunkBuilder . renderFunction (
31113151 name : abiName ,
@@ -3114,16 +3154,18 @@ extension BridgeJSLink {
31143154 )
31153155 importObjectBuilder . assignToImportObject ( name : abiName , function : funcLines )
31163156
3117- let dtsPrinter = CodeFragmentPrinter ( )
3118- dtsPrinter . write ( " \( type . name ) : { " )
3119- dtsPrinter . indent {
3120- dtsPrinter . write (
3121- " new \( renderTSSignature ( parameters : constructor . parameters , returnType : returnType , effects : Effects ( isAsync : false , isThrows : false ) ) ) ; "
3122- )
3123- }
3124- dtsPrinter . write ( " } " )
3157+ if type . from == nil {
3158+ let dtsPrinter = CodeFragmentPrinter ( )
3159+ dtsPrinter . write ( " \( type . name ) : { " )
3160+ dtsPrinter . indent {
3161+ dtsPrinter . write (
3162+ " new \( renderTSSignature ( parameters : constructor . parameters , returnType : returnType , effects : Effects ( isAsync : false , isThrows : false ) ) ) ; "
3163+ )
3164+ }
3165+ dtsPrinter . write ( " } " )
31253166
3126- importObjectBuilder . appendDts ( dtsPrinter . lines )
3167+ importObjectBuilder . appendDts ( dtsPrinter . lines )
3168+ }
31273169 }
31283170
31293171 func renderImportedGetter (
0 commit comments