@@ -1254,16 +1254,6 @@ struct BridgeJSLink {
12541254 ]
12551255 }
12561256
1257- func generateParameterList ( parameters : [ Parameter ] ) -> String {
1258- parameters . map { param in
1259- if let defaultValue = param . defaultValue {
1260- let defaultJs = DefaultValueGenerator ( ) . generate ( defaultValue , format : . javascript )
1261- return " \( param . name ) = \( defaultJs ) "
1262- }
1263- return param . name
1264- } . joined ( separator : " , " )
1265- }
1266-
12671257 func renderFunction (
12681258 name : String ,
12691259 parameters : [ Parameter ] ,
@@ -1272,7 +1262,7 @@ struct BridgeJSLink {
12721262 ) -> [ String ] {
12731263 let printer = CodeFragmentPrinter ( )
12741264
1275- let parameterList = generateParameterList ( parameters : parameters )
1265+ let parameterList = DefaultValueUtils . formatParameterList ( parameters )
12761266
12771267 printer . write (
12781268 " \( declarationPrefixKeyword . map { " \( $0 ) " } ?? " " ) \( name ) ( \( parameterList ) ) { "
@@ -1350,76 +1340,10 @@ struct BridgeJSLink {
13501340
13511341 /// Helper method to append JSDoc comments for parameters with default values
13521342 private func appendJSDocIfNeeded ( for parameters : [ Parameter ] , to lines : inout [ String ] ) {
1353- let jsDocLines = DefaultValueGenerator ( ) . generateJSDoc ( for : parameters )
1343+ let jsDocLines = DefaultValueUtils . formatJSDoc ( for : parameters )
13541344 lines . append ( contentsOf : jsDocLines )
13551345 }
13561346
1357- /// Helper struct for generating default value representations
1358- private struct DefaultValueGenerator {
1359- enum OutputFormat {
1360- case javascript
1361- case typescript
1362- }
1363-
1364- /// Generates default value representation for JavaScript or TypeScript
1365- func generate ( _ defaultValue : DefaultValue , format : OutputFormat ) -> String {
1366- switch defaultValue {
1367- case . string ( let value ) :
1368- let escapedValue =
1369- format == . javascript
1370- ? escapeForJavaScript ( value )
1371- : value // TypeScript doesn't need escape in doc comments
1372- return " \" \( escapedValue ) \" "
1373- case . int ( let value ) :
1374- return " \( value ) "
1375- case . float ( let value ) :
1376- return " \( value ) "
1377- case . double ( let value ) :
1378- return " \( value ) "
1379- case . bool ( let value ) :
1380- return value ? " true " : " false "
1381- case . null :
1382- return " null "
1383- case . enumCase ( let enumName , let caseName ) :
1384- let simpleName = enumName . components ( separatedBy : " . " ) . last ?? enumName
1385- let jsEnumName = format == . javascript ? " \( simpleName ) \( ExportedEnum . valuesSuffix ) " : simpleName
1386- return " \( jsEnumName ) . \( caseName . capitalizedFirstLetter ) "
1387- case . object ( let className ) :
1388- return " new \( className ) () "
1389- case . objectWithArguments ( let className , let args ) :
1390- let argStrings = args . map { arg in
1391- generate ( arg , format : format )
1392- }
1393- return " new \( className ) ( \( argStrings . joined ( separator : " , " ) ) ) "
1394- }
1395- }
1396-
1397- private func escapeForJavaScript ( _ string : String ) -> String {
1398- return
1399- string
1400- . replacingOccurrences ( of : " \\ " , with : " \\ \\ " )
1401- . replacingOccurrences ( of : " \" " , with : " \\ \" " )
1402- }
1403-
1404- /// Generates JSDoc comment lines for parameters with default values
1405- func generateJSDoc ( for parameters : [ Parameter ] ) -> [ String ] {
1406- let paramsWithDefaults = parameters . filter { $0 . hasDefault }
1407- guard ! paramsWithDefaults . isEmpty else {
1408- return [ ]
1409- }
1410-
1411- var jsDocLines : [ String ] = [ " /**"]
1412- for param in paramsWithDefaults {
1413- if let defaultValue = param.defaultValue {
1414- let defaultDoc = generate(defaultValue, format: .typescript)
1415- jsDocLines.append(" * @param \(param.name) - Optional parameter (default: \(defaultDoc))")
1416- }
1417- }
1418- jsDocLines.append(" */" )
1419- return jsDocLines
1420- }
1421- }
1422-
14231347 func renderExportedStruct (
14241348 _ structDefinition : ExportedStruct
14251349 ) throws -> ( js : [ String ] , dtsType : [ String ] , dtsExportEntry : [ String ] ) {
@@ -1437,6 +1361,8 @@ struct BridgeJSLink {
14371361 dtsTypePrinter . write ( " \( property . name ) : \( tsType ) ; " )
14381362 }
14391363 for method in structDefinition . methods where ! method . effects . isStatic {
1364+ let jsDocLines = DefaultValueUtils . formatJSDoc ( for : method . parameters )
1365+ dtsTypePrinter . write ( lines : jsDocLines )
14401366 let signature = renderTSSignature (
14411367 parameters : method . parameters ,
14421368 returnType : method . returnType ,
@@ -1466,7 +1392,7 @@ struct BridgeJSLink {
14661392 )
14671393
14681394 let constructorPrinter = CodeFragmentPrinter ( )
1469- let paramList = thunkBuilder . generateParameterList ( parameters : constructor . parameters )
1395+ let paramList = DefaultValueUtils . formatParameterList ( constructor . parameters )
14701396 constructorPrinter . write ( " init: function( \( paramList ) ) { " )
14711397 constructorPrinter . indent {
14721398 constructorPrinter . write ( contentsOf : thunkBuilder . body )
@@ -1499,6 +1425,8 @@ struct BridgeJSLink {
14991425 dtsExportEntryPrinter . write ( " \( structName ) : { " )
15001426 dtsExportEntryPrinter . indent {
15011427 if let constructor = structDefinition . constructor {
1428+ let jsDocLines = DefaultValueUtils . formatJSDoc ( for : constructor . parameters )
1429+ dtsExportEntryPrinter . write ( lines : jsDocLines )
15021430 dtsExportEntryPrinter . write (
15031431 " init \( renderTSSignature ( parameters : constructor . parameters , returnType : . swiftStruct ( structDefinition . swiftCallName ) , effects : constructor . effects ) ) ; "
15041432 )
@@ -1508,6 +1436,8 @@ struct BridgeJSLink {
15081436 dtsExportEntryPrinter . write ( " \( readonly ) \( property . name ) : \( resolveTypeScriptType ( property . type ) ) ; " )
15091437 }
15101438 for method in staticMethods {
1439+ let jsDocLines = DefaultValueUtils . formatJSDoc ( for : method . parameters )
1440+ dtsExportEntryPrinter . write ( lines : jsDocLines )
15111441 dtsExportEntryPrinter . write (
15121442 " \( method . name ) \( renderTSSignature ( parameters : method . parameters , returnType : method . returnType , effects : method . effects ) ) ; "
15131443 )
@@ -1930,7 +1860,7 @@ extension BridgeJSLink {
19301860 try thunkBuilder . lowerParameter ( param : param )
19311861 }
19321862
1933- let constructorParamList = thunkBuilder . generateParameterList ( parameters : constructor . parameters )
1863+ let constructorParamList = DefaultValueUtils . formatParameterList ( constructor . parameters )
19341864
19351865 jsPrinter . indent {
19361866 jsPrinter . write ( " constructor( \( constructorParamList ) ) { " )
@@ -1945,7 +1875,7 @@ extension BridgeJSLink {
19451875 }
19461876
19471877 dtsExportEntryPrinter . indent {
1948- let jsDocLines = DefaultValueGenerator ( ) . generateJSDoc ( for : constructor . parameters )
1878+ let jsDocLines = DefaultValueUtils . formatJSDoc ( for : constructor . parameters )
19491879 for line in jsDocLines {
19501880 dtsExportEntryPrinter . write ( line )
19511881 }
@@ -3173,6 +3103,88 @@ extension BridgeJSLink {
31733103 }
31743104}
31753105
3106+ /// Utility enum for generating default value representations in JavaScript/TypeScript
3107+ enum DefaultValueUtils {
3108+ enum OutputFormat {
3109+ case javascript
3110+ case typescript
3111+ }
3112+
3113+ /// Generates default value representation for JavaScript or TypeScript
3114+ static func format ( _ defaultValue : DefaultValue , as format : OutputFormat ) -> String {
3115+ switch defaultValue {
3116+ case . string ( let value ) :
3117+ let escapedValue =
3118+ format == . javascript
3119+ ? escapeForJavaScript ( value )
3120+ : value // TypeScript doesn't need escape in doc comments
3121+ return " \" \( escapedValue ) \" "
3122+ case . int ( let value ) :
3123+ return " \( value ) "
3124+ case . float ( let value ) :
3125+ return " \( value ) "
3126+ case . double ( let value ) :
3127+ return " \( value ) "
3128+ case . bool ( let value ) :
3129+ return value ? " true " : " false "
3130+ case . null :
3131+ return " null "
3132+ case . enumCase ( let enumName , let caseName ) :
3133+ let simpleName = enumName . components ( separatedBy : " . " ) . last ?? enumName
3134+ let jsEnumName = format == . javascript ? " \( simpleName ) \( ExportedEnum . valuesSuffix ) " : simpleName
3135+ return " \( jsEnumName ) . \( caseName . capitalizedFirstLetter ) "
3136+ case . object ( let className ) :
3137+ return " new \( className ) () "
3138+ case . objectWithArguments ( let className , let args ) :
3139+ let argStrings = args . map { arg in
3140+ Self . format ( arg , as : format )
3141+ }
3142+ return " new \( className ) ( \( argStrings . joined ( separator : " , " ) ) ) "
3143+ case . structLiteral ( _, let fields ) :
3144+ let fieldStrings = fields . map { field in
3145+ " \( field . name ) : \( Self . format ( field . value , as : format ) ) "
3146+ }
3147+ return " { \( fieldStrings . joined ( separator : " , " ) ) } "
3148+ }
3149+ }
3150+
3151+ private static func escapeForJavaScript ( _ string : String ) -> String {
3152+ return
3153+ string
3154+ . replacingOccurrences ( of : " \\ " , with : " \\ \\ " )
3155+ . replacingOccurrences ( of : " \" " , with : " \\ \" " )
3156+ }
3157+
3158+ /// Generates JSDoc comment lines for parameters with default values
3159+ static func formatJSDoc ( for parameters : [ Parameter ] ) -> [ String ] {
3160+ let paramsWithDefaults = parameters . filter { $0 . hasDefault }
3161+ guard ! paramsWithDefaults . isEmpty else {
3162+ return [ ]
3163+ }
3164+
3165+ var jsDocLines : [ String ] = [ " /**"]
3166+ for param in paramsWithDefaults {
3167+ if let defaultValue = param.defaultValue {
3168+ let defaultDoc = format(defaultValue, as: .typescript)
3169+ jsDocLines.append(" * @param \(param.name) - Optional parameter (default: \(defaultDoc))")
3170+ }
3171+ }
3172+ jsDocLines.append(" */" )
3173+ return jsDocLines
3174+ }
3175+
3176+ /// Generates a JavaScript parameter list with default values
3177+ static func formatParameterList ( _ parameters : [ Parameter ] ) -> String {
3178+ return parameters . map { param in
3179+ if let defaultValue = param . defaultValue {
3180+ let defaultJs = format ( defaultValue , as : . javascript )
3181+ return " \( param . name ) = \( defaultJs ) "
3182+ }
3183+ return param . name
3184+ } . joined ( separator : " , " )
3185+ }
3186+ }
3187+
31763188struct BridgeJSLinkError : Error {
31773189 let message : String
31783190}
0 commit comments