@@ -240,7 +240,9 @@ struct BridgeJSLink {
240240 enumPropertyPrinter . write ( " }, " )
241241
242242 if ! property . isReadonly {
243- let setterThunkBuilder = ExportedThunkBuilder ( effects : Effects ( isAsync : false , isThrows : false ) )
243+ let setterThunkBuilder = ExportedThunkBuilder (
244+ effects : Effects ( isAsync : false , isThrows : false )
245+ )
244246 try setterThunkBuilder . lowerParameter (
245247 param : Parameter ( label : " value " , name : " value " , type : property . type )
246248 )
@@ -300,6 +302,29 @@ struct BridgeJSLink {
300302 data . importObjectBuilders . append ( importObjectBuilder )
301303 }
302304
305+ for skeleton in exportedSkeletons {
306+ if ! skeleton . protocols . isEmpty {
307+ let importObjectBuilder : ImportObjectBuilder
308+ if let existingBuilder = data . importObjectBuilders . first ( where : { $0 . moduleName == skeleton . moduleName }
309+ ) {
310+ importObjectBuilder = existingBuilder
311+ } else {
312+ importObjectBuilder = ImportObjectBuilder ( moduleName : skeleton . moduleName )
313+ data . importObjectBuilders . append ( importObjectBuilder )
314+ }
315+
316+ for proto in skeleton . protocols {
317+ for method in proto . methods {
318+ try renderProtocolMethod (
319+ importObjectBuilder : importObjectBuilder ,
320+ protocol : proto ,
321+ method : method
322+ )
323+ }
324+ }
325+ }
326+ }
327+
303328 return data
304329 }
305330
@@ -572,6 +597,22 @@ struct BridgeJSLink {
572597 """
573598 let printer = CodeFragmentPrinter ( header : header )
574599 printer . nextLine ( )
600+
601+ for skeleton in exportedSkeletons {
602+ for proto in skeleton . protocols {
603+ printer . write ( " export interface \( proto . name ) { " )
604+ printer . indent {
605+ for method in proto . methods {
606+ printer . write (
607+ " \( method . name ) \( renderTSSignature ( parameters : method . parameters , returnType : method . returnType , effects : method . effects ) ) ; "
608+ )
609+ }
610+ }
611+ printer . write ( " } " )
612+ printer . nextLine ( )
613+ }
614+ }
615+
575616 printer . write ( lines : data . topLevelDtsEnumLines )
576617
577618 // Generate Object types for const-style enums
@@ -1468,7 +1509,9 @@ extension BridgeJSLink {
14681509
14691510 if ! property . isReadonly {
14701511 // Generate setter
1471- let setterThunkBuilder = ExportedThunkBuilder ( effects : Effects ( isAsync : false , isThrows : false ) )
1512+ let setterThunkBuilder = ExportedThunkBuilder (
1513+ effects : Effects ( isAsync : false , isThrows : false )
1514+ )
14721515 try setterThunkBuilder . lowerParameter (
14731516 param : Parameter ( label : " value " , name : " value " , type : property . type )
14741517 )
@@ -1539,7 +1582,9 @@ extension BridgeJSLink {
15391582
15401583 if ! property . isReadonly {
15411584 // Generate setter
1542- let setterThunkBuilder = ExportedThunkBuilder ( effects : Effects ( isAsync : false , isThrows : false ) )
1585+ let setterThunkBuilder = ExportedThunkBuilder (
1586+ effects : Effects ( isAsync : false , isThrows : false )
1587+ )
15431588 try setterThunkBuilder . lowerParameter (
15441589 param : Parameter ( label : " value " , name : " value " , type : property . type )
15451590 )
@@ -1704,7 +1749,9 @@ extension BridgeJSLink {
17041749
17051750 // Generate static property setter if not readonly
17061751 if ! property . isReadonly {
1707- let setterThunkBuilder = ExportedThunkBuilder ( effects : Effects ( isAsync : false , isThrows : false ) )
1752+ let setterThunkBuilder = ExportedThunkBuilder (
1753+ effects : Effects ( isAsync : false , isThrows : false )
1754+ )
17081755 try setterThunkBuilder . lowerParameter (
17091756 param : Parameter ( label : " value " , name : " value " , type : property . type )
17101757 )
@@ -1752,7 +1799,9 @@ extension BridgeJSLink {
17521799
17531800 // Generate instance property setter if not readonly
17541801 if ! property . isReadonly {
1755- let setterThunkBuilder = ExportedThunkBuilder ( effects : Effects ( isAsync : false , isThrows : false ) )
1802+ let setterThunkBuilder = ExportedThunkBuilder (
1803+ effects : Effects ( isAsync : false , isThrows : false )
1804+ )
17561805 setterThunkBuilder . lowerSelf ( )
17571806 try setterThunkBuilder . lowerParameter (
17581807 param : Parameter ( label : " value " , name : " value " , type : property . type )
@@ -2367,6 +2416,25 @@ extension BridgeJSLink {
23672416 )
23682417 return ( funcLines , [ ] )
23692418 }
2419+
2420+ func renderProtocolMethod (
2421+ importObjectBuilder : ImportObjectBuilder ,
2422+ protocol : ExportedProtocol ,
2423+ method : ExportedFunction
2424+ ) throws {
2425+ let thunkBuilder = ImportedThunkBuilder ( )
2426+ thunkBuilder . liftSelf ( )
2427+ for param in method . parameters {
2428+ try thunkBuilder . liftParameter ( param : param )
2429+ }
2430+ let returnExpr = try thunkBuilder . callMethod ( name : method . name , returnType : method . returnType )
2431+ let funcLines = thunkBuilder . renderFunction (
2432+ name : method . abiName ,
2433+ returnExpr : returnExpr ,
2434+ returnType : method . returnType
2435+ )
2436+ importObjectBuilder . assignToImportObject ( name : method . abiName , function : funcLines )
2437+ }
23702438}
23712439
23722440struct BridgeJSLinkError : Error {
@@ -2402,6 +2470,8 @@ extension BridgeType {
24022470 return " \( name ) Tag "
24032471 case . namespaceEnum ( let name ) :
24042472 return name
2473+ case . swiftProtocol ( let name ) :
2474+ return name
24052475 }
24062476 }
24072477}
0 commit comments