@@ -1758,7 +1758,7 @@ public struct BridgeJSLink {
17581758 loweringFragment. parameters. count == 1 ,
17591759 " Lowering fragment should have exactly one parameter to lower "
17601760 )
1761- let paramName = scope. variable ( param. name )
1761+ let paramName = scope. variable ( param. escapedJSIdentifier )
17621762 let loweredValues = try loweringFragment. printCode ( [ paramName] , context)
17631763 parameterForwardings. append ( contentsOf: loweredValues)
17641764 }
@@ -1950,7 +1950,7 @@ public struct BridgeJSLink {
19501950 }
19511951 let parameterSignatures = parameters. map { param in
19521952 let optional = param. hasDefault ? " ? " : " "
1953- return " \( param. name ) \( optional) : \( resolveTypeScriptType ( param. type) ) "
1953+ return " \( param. escapedJSIdentifier ) \( optional) : \( resolveTypeScriptType ( param. type) ) "
19541954 }
19551955 return " ( \( parameterSignatures. joined ( separator: " , " ) ) ): \( returnTypeWithEffect) "
19561956 }
@@ -2669,7 +2669,7 @@ extension BridgeJSLink {
26692669 if let constructor = klass. constructor {
26702670 let paramSignatures = constructor. parameters. map { param in
26712671 let optional = param. hasDefault ? " ? " : " "
2672- return " \( param. name ) \( optional) : \( resolveTypeScriptType ( param. type) ) "
2672+ return " \( param. escapedJSIdentifier ) \( optional) : \( resolveTypeScriptType ( param. type) ) "
26732673 }
26742674 printer. write (
26752675 lines: renderJSDoc ( documentation: constructor. documentation, parameters: constructor. parameters)
@@ -4321,9 +4321,9 @@ enum DefaultValueUtils {
43214321 return parameters. map { param in
43224322 if let defaultValue = param. defaultValue {
43234323 let defaultJs = format ( defaultValue, as: . javascript, resolveTypeName: resolveTypeName)
4324- return " \( param. name ) = \( defaultJs) "
4324+ return " \( param. escapedJSIdentifier ) = \( defaultJs) "
43254325 }
4326- return param. name
4326+ return param. escapedJSIdentifier
43274327 } . joined ( separator: " , " )
43284328 }
43294329}
@@ -4348,11 +4348,11 @@ extension BridgeJSLink {
43484348 }
43494349 switch ( docText, defaultValue) {
43504350 case let ( . some( text) , . some( value) ) :
4351- tagLines. append ( " @param \( parameter. name ) \( text) (default: \( value) ) " )
4351+ tagLines. append ( " @param \( parameter. escapedJSIdentifier ) \( text) (default: \( value) ) " )
43524352 case let ( . some( text) , . none) :
4353- tagLines. append ( " @param \( parameter. name ) \( text) " )
4353+ tagLines. append ( " @param \( parameter. escapedJSIdentifier ) \( text) " )
43544354 case let ( . none, . some( value) ) :
4355- tagLines. append ( " @param \( parameter. name ) - Optional parameter (default: \( value) ) " )
4355+ tagLines. append ( " @param \( parameter. escapedJSIdentifier ) - Optional parameter (default: \( value) ) " )
43564356 case ( . none, . none) :
43574357 continue
43584358 }
@@ -4477,6 +4477,21 @@ struct BridgeJSLinkError: Error {
44774477 let message : String
44784478}
44794479
4480+ extension Parameter {
4481+ // From: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#reserved_words
4482+ private static let javaScriptReservedWords : Set < String > = [
4483+ " break " , " case " , " catch " , " class " , " const " , " continue " , " debugger " , " default " , " delete " , " do " , " else " ,
4484+ " export " , " extends " , " false " , " finally " , " for " , " function " , " if " , " import " , " in " , " instanceof " , " new " ,
4485+ " null " , " return " , " super " , " switch " , " this " , " throw " , " true " , " try " , " typeof " , " var " , " void " , " while " ,
4486+ " with " , " let " , " static " , " yield " , " await " , " enum " , " implements " , " interface " , " package " , " private " ,
4487+ " protected " , " public " , " arguments " , " eval " ,
4488+ ]
4489+
4490+ fileprivate var escapedJSIdentifier : String {
4491+ Self . javaScriptReservedWords. contains ( name) ? " _ \( name) " : name
4492+ }
4493+ }
4494+
44804495extension ClosureSignature {
44814496 fileprivate func renderTSFunctionType( renderType: ( BridgeType ) -> String ) -> String {
44824497 let renderedParameters = parameters. enumerated ( ) . map { index, parameter in
0 commit comments