@@ -567,9 +567,39 @@ extension JavaClassTranslator {
567567 let overrideOpt = ( translateAsClass && !javaMethod. isStatic && isOverride ( javaMethod) )
568568 ? " override "
569569 : " "
570- return """
571- \( methodAttribute) \( raw: accessModifier) \( raw: overrideOpt) func \( raw: swiftMethodName) \( raw: genericParameterClause) ( \( raw: parametersStr) ) \( raw: throwsStr) \( raw: resultTypeStr) \( raw: whereClause)
572- """
570+
571+ if resultType. optionalWrappedType ( ) != nil || parameters. contains ( where: { $0. type. trimmedDescription. optionalWrappedType ( ) != nil } ) {
572+ let parameters = parameters. map { param -> ( clause: FunctionParameterSyntax , passedArg: String ) in
573+ let name = param. secondName!. trimmedDescription
574+
575+ return if let optionalType = param. type. trimmedDescription. optionalWrappedType ( ) {
576+ ( clause: " _ \( raw: name) : \( raw: optionalType) " , passedArg: " \( name) .toJavaOptional() " )
577+ } else {
578+ ( clause: param, passedArg: " \( name) " )
579+ }
580+ }
581+
582+ let resultOptional : String = resultType. optionalWrappedType ( ) ?? resultType
583+ let baseBody : ExprSyntax = " \( raw: javaMethod. throwsCheckedException ? " try " : " " ) \( raw: swiftMethodName) ( \( raw: parameters. map ( \. passedArg) . joined ( separator: " , " ) ) ) "
584+ let body : ExprSyntax = if let optionalType = resultType. optionalWrappedType ( ) {
585+ " Optional(javaOptional: \( baseBody) ) "
586+ } else {
587+ baseBody
588+ }
589+
590+
591+ return """
592+ \( methodAttribute) \( raw: accessModifier) \( raw: overrideOpt) func \( raw: swiftMethodName) \( raw: genericParameterClause) ( \( raw: parametersStr) ) \( raw: throwsStr) \( raw: resultTypeStr) \( raw: whereClause)
593+
594+ \( raw: accessModifier) \( raw: overrideOpt) func \( raw: swiftMethodName) Optional \( raw: genericParameterClause) ( \( raw: parameters. map ( \. clause. description) . joined ( separator: " , " ) ) ) \( raw: throwsStr) -> \( raw: resultOptional) \( raw: whereClause) {
595+ \( body)
596+ }
597+ """
598+ } else {
599+ return """
600+ \( methodAttribute) \( raw: accessModifier) \( raw: overrideOpt) func \( raw: swiftMethodName) \( raw: genericParameterClause) ( \( raw: parametersStr) ) \( raw: throwsStr) \( raw: resultTypeStr) \( raw: whereClause)
601+ """
602+ }
573603 }
574604
575605 /// Render a single Java field into the corresponding Swift property, or
@@ -582,10 +612,35 @@ extension JavaClassTranslator {
582612 )
583613 let fieldAttribute : AttributeSyntax = javaField. isStatic ? " @JavaStaticField " : " @JavaField " ;
584614 let swiftFieldName = javaField. getName ( ) . escapedSwiftName
585- return """
615+
616+ if let optionalType = typeName. optionalWrappedType ( ) {
617+ let setter = if !javaField. isFinal {
618+ """
619+
620+ set {
621+ \( swiftFieldName) = newValue.toJavaOptional()
622+ }
623+ """
624+ } else {
625+ " "
626+ }
627+ return """
628+ \( fieldAttribute) (isFinal: \( raw: javaField. isFinal) )
629+ public var \( raw: swiftFieldName) : \( raw: typeName)
630+
631+
632+ public var \( raw: swiftFieldName) Optional: \( raw: optionalType) {
633+ get {
634+ Optional(javaOptional: \( raw: swiftFieldName) )
635+ } \( raw: setter)
636+ }
637+ """
638+ } else {
639+ return """
586640 \( fieldAttribute) (isFinal: \( raw: javaField. isFinal) )
587641 public var \( raw: swiftFieldName) : \( raw: typeName)
588642 """
643+ }
589644 }
590645
591646 package func renderEnum( name: String ) -> [ DeclSyntax ] {
0 commit comments