@@ -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