diff --git a/example/src/getTests.ts b/example/src/getTests.ts index a13c0a643..5d21568b1 100644 --- a/example/src/getTests.ts +++ b/example/src/getTests.ts @@ -1957,6 +1957,22 @@ export function getTests( .didNotThrow() .equals('This is overridden!') ), + createTest('getNumber(...) works for number', () => + it(() => { + const object = testObject.createInternalObject() + return object.getNumber(57) + }) + .didNotThrow() + .equals({ number: 57 }) + ), + createTest('getNumber(...) works for undefined', () => + it(() => { + const object = testObject.createInternalObject() + return object.getNumber() + }) + .didNotThrow() + .equals({ number: undefined }) + ), createTest('new T() works', () => it(() => { const HybridTestObjectCpp = diff --git a/packages/nitrogen/src/syntax/swift/SwiftCxxBridgedType.ts b/packages/nitrogen/src/syntax/swift/SwiftCxxBridgedType.ts index fa0c3ff14..c353cf977 100644 --- a/packages/nitrogen/src/syntax/swift/SwiftCxxBridgedType.ts +++ b/packages/nitrogen/src/syntax/swift/SwiftCxxBridgedType.ts @@ -468,7 +468,16 @@ export class SwiftCxxBridgedType implements BridgedType<'swift', 'c++'> { // TODO: Remove this check for booleans once https://github.com/swiftlang/swift/issues/84848 is fixed. const swiftBug84848Workaround = optional.wrappingType.kind === 'boolean' - if (!wrapping.needsSpecialHandling && !swiftBug84848Workaround) { + + // TODO: Remove this check for numbers once https://github.com/swiftlang/swift/issues/85735 is fixed. + const swiftBug85735Workaround = + optional.wrappingType.kind === 'number' + + if ( + !wrapping.needsSpecialHandling && + !swiftBug84848Workaround && + !swiftBug85735Workaround + ) { return `${cppParameterName}.value` } return ` diff --git a/packages/react-native-nitro-test-external/android/src/main/java/com/margelo/nitro/test/external/HybridSomeExternalObject.kt b/packages/react-native-nitro-test-external/android/src/main/java/com/margelo/nitro/test/external/HybridSomeExternalObject.kt index 0d8ae2069..41a3d6bf1 100644 --- a/packages/react-native-nitro-test-external/android/src/main/java/com/margelo/nitro/test/external/HybridSomeExternalObject.kt +++ b/packages/react-native-nitro-test-external/android/src/main/java/com/margelo/nitro/test/external/HybridSomeExternalObject.kt @@ -4,4 +4,8 @@ class HybridSomeExternalObject : HybridSomeExternalObjectSpec() { override fun getValue(): String { return "Hello world!" } + + override fun getNumber(number: Double?): SomeExternalObjectNumber { + return SomeExternalObjectNumber(number = number ?: null) + } } diff --git a/packages/react-native-nitro-test-external/ios/HybridSomeExternalObject.swift b/packages/react-native-nitro-test-external/ios/HybridSomeExternalObject.swift index f295d3cac..455c4e58f 100644 --- a/packages/react-native-nitro-test-external/ios/HybridSomeExternalObject.swift +++ b/packages/react-native-nitro-test-external/ios/HybridSomeExternalObject.swift @@ -9,7 +9,15 @@ import Foundation import NitroModules class HybridSomeExternalObject: HybridSomeExternalObjectSpec { + + func getValue() throws -> String { return "Hello world!" } + + func getNumber(number: Double?) throws -> SomeExternalObjectNumber { + return SomeExternalObjectNumber( + number: number + ) + } } diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JHybridSomeExternalObjectSpec.cpp b/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JHybridSomeExternalObjectSpec.cpp index 29edc092e..653e9fea6 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JHybridSomeExternalObjectSpec.cpp +++ b/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JHybridSomeExternalObjectSpec.cpp @@ -7,9 +7,13 @@ #include "JHybridSomeExternalObjectSpec.hpp" - +// Forward declaration of `SomeExternalObjectNumber` to properly resolve imports. +namespace margelo::nitro::test::external { struct SomeExternalObjectNumber; } #include +#include "SomeExternalObjectNumber.hpp" +#include "JSomeExternalObjectNumber.hpp" +#include namespace margelo::nitro::test::external { @@ -48,5 +52,10 @@ namespace margelo::nitro::test::external { auto __result = method(_javaPart); return __result->toStdString(); } + SomeExternalObjectNumber JHybridSomeExternalObjectSpec::getNumber(std::optional number) { + static const auto method = javaClassStatic()->getMethod(jni::alias_ref /* number */)>("getNumber"); + auto __result = method(_javaPart, number.has_value() ? jni::JDouble::valueOf(number.value()) : nullptr); + return __result->toCpp(); + } } // namespace margelo::nitro::test::external diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JHybridSomeExternalObjectSpec.hpp b/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JHybridSomeExternalObjectSpec.hpp index 1e690130e..0ab6628fa 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JHybridSomeExternalObjectSpec.hpp +++ b/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JHybridSomeExternalObjectSpec.hpp @@ -55,6 +55,7 @@ namespace margelo::nitro::test::external { public: // Methods std::string getValue() override; + SomeExternalObjectNumber getNumber(std::optional number) override; private: friend HybridBase; diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JSomeExternalObjectNumber.hpp b/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JSomeExternalObjectNumber.hpp new file mode 100644 index 000000000..ed1cba641 --- /dev/null +++ b/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/JSomeExternalObjectNumber.hpp @@ -0,0 +1,57 @@ +/// +/// JSomeExternalObjectNumber.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "SomeExternalObjectNumber.hpp" + +#include + +namespace margelo::nitro::test::external { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ struct "SomeExternalObjectNumber" and the the Kotlin data class "SomeExternalObjectNumber". + */ + struct JSomeExternalObjectNumber final: public jni::JavaClass { + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/test/external/SomeExternalObjectNumber;"; + + public: + /** + * Convert this Java/Kotlin-based struct to the C++ struct SomeExternalObjectNumber by copying all values to C++. + */ + [[maybe_unused]] + [[nodiscard]] + SomeExternalObjectNumber toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldNumber = clazz->getField("number"); + jni::local_ref number = this->getFieldValue(fieldNumber); + return SomeExternalObjectNumber( + number != nullptr ? std::make_optional(number->value()) : std::nullopt + ); + } + + public: + /** + * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java. + */ + [[maybe_unused]] + static jni::local_ref fromCpp(const SomeExternalObjectNumber& value) { + using JSignature = JSomeExternalObjectNumber(jni::alias_ref); + static const auto clazz = javaClassStatic(); + static const auto create = clazz->getStaticMethod("fromCpp"); + return create( + clazz, + value.number.has_value() ? jni::JDouble::valueOf(value.number.value()) : nullptr + ); + } + }; + +} // namespace margelo::nitro::test::external diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/android/kotlin/com/margelo/nitro/test/external/HybridSomeExternalObjectSpec.kt b/packages/react-native-nitro-test-external/nitrogen/generated/android/kotlin/com/margelo/nitro/test/external/HybridSomeExternalObjectSpec.kt index 931ed403c..cddafafd0 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/android/kotlin/com/margelo/nitro/test/external/HybridSomeExternalObjectSpec.kt +++ b/packages/react-native-nitro-test-external/nitrogen/generated/android/kotlin/com/margelo/nitro/test/external/HybridSomeExternalObjectSpec.kt @@ -48,6 +48,10 @@ abstract class HybridSomeExternalObjectSpec: HybridObject() { @DoNotStrip @Keep abstract fun getValue(): String + + @DoNotStrip + @Keep + abstract fun getNumber(number: Double?): SomeExternalObjectNumber private external fun initHybrid(): HybridData diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/android/kotlin/com/margelo/nitro/test/external/SomeExternalObjectNumber.kt b/packages/react-native-nitro-test-external/nitrogen/generated/android/kotlin/com/margelo/nitro/test/external/SomeExternalObjectNumber.kt new file mode 100644 index 000000000..1e80eb7c5 --- /dev/null +++ b/packages/react-native-nitro-test-external/nitrogen/generated/android/kotlin/com/margelo/nitro/test/external/SomeExternalObjectNumber.kt @@ -0,0 +1,38 @@ +/// +/// SomeExternalObjectNumber.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.test.external + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip + + +/** + * Represents the JavaScript object/struct "SomeExternalObjectNumber". + */ +@DoNotStrip +@Keep +data class SomeExternalObjectNumber( + @DoNotStrip + @Keep + val number: Double? +) { + /* primary constructor */ + + companion object { + /** + * Constructor called from C++ + */ + @DoNotStrip + @Keep + @Suppress("unused") + @JvmStatic + private fun fromCpp(number: Double?): SomeExternalObjectNumber { + return SomeExternalObjectNumber(number) + } + } +} diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/ios/NitroTestExternal-Swift-Cxx-Bridge.hpp b/packages/react-native-nitro-test-external/nitrogen/generated/ios/NitroTestExternal-Swift-Cxx-Bridge.hpp index cc20c0e4a..868a88dcf 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/ios/NitroTestExternal-Swift-Cxx-Bridge.hpp +++ b/packages/react-native-nitro-test-external/nitrogen/generated/ios/NitroTestExternal-Swift-Cxx-Bridge.hpp @@ -10,6 +10,8 @@ // Forward declarations of C++ defined types // Forward declaration of `HybridSomeExternalObjectSpec` to properly resolve imports. namespace margelo::nitro::test::external { class HybridSomeExternalObjectSpec; } +// Forward declaration of `SomeExternalObjectNumber` to properly resolve imports. +namespace margelo::nitro::test::external { struct SomeExternalObjectNumber; } // Forward declarations of Swift defined types // Forward declaration of `HybridSomeExternalObjectSpec_cxx` to properly resolve imports. @@ -17,9 +19,11 @@ namespace NitroTestExternal { class HybridSomeExternalObjectSpec_cxx; } // Include C++ defined types #include "HybridSomeExternalObjectSpec.hpp" +#include "SomeExternalObjectNumber.hpp" #include #include #include +#include #include /** @@ -28,6 +32,21 @@ namespace NitroTestExternal { class HybridSomeExternalObjectSpec_cxx; } */ namespace margelo::nitro::test::external::bridge::swift { + // pragma MARK: std::optional + /** + * Specialized version of `std::optional`. + */ + using std__optional_double_ = std::optional; + inline std::optional create_std__optional_double_(const double& value) noexcept { + return std::optional(value); + } + inline bool has_value_std__optional_double_(const std::optional& optional) noexcept { + return optional.has_value(); + } + inline double get_std__optional_double_(const std::optional& optional) noexcept { + return *optional; + } + // pragma MARK: std::shared_ptr /** * Specialized version of `std::shared_ptr`. @@ -48,5 +67,14 @@ namespace margelo::nitro::test::external::bridge::swift { inline Result_std__string_ create_Result_std__string_(const std::exception_ptr& error) noexcept { return Result::withError(error); } + + // pragma MARK: Result + using Result_SomeExternalObjectNumber_ = Result; + inline Result_SomeExternalObjectNumber_ create_Result_SomeExternalObjectNumber_(const SomeExternalObjectNumber& value) noexcept { + return Result::withValue(value); + } + inline Result_SomeExternalObjectNumber_ create_Result_SomeExternalObjectNumber_(const std::exception_ptr& error) noexcept { + return Result::withError(error); + } } // namespace margelo::nitro::test::external::bridge::swift diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/ios/NitroTestExternal-Swift-Cxx-Umbrella.hpp b/packages/react-native-nitro-test-external/nitrogen/generated/ios/NitroTestExternal-Swift-Cxx-Umbrella.hpp index 9ee8c3be9..fa7059358 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/ios/NitroTestExternal-Swift-Cxx-Umbrella.hpp +++ b/packages/react-native-nitro-test-external/nitrogen/generated/ios/NitroTestExternal-Swift-Cxx-Umbrella.hpp @@ -10,12 +10,16 @@ // Forward declarations of C++ defined types // Forward declaration of `HybridSomeExternalObjectSpec` to properly resolve imports. namespace margelo::nitro::test::external { class HybridSomeExternalObjectSpec; } +// Forward declaration of `SomeExternalObjectNumber` to properly resolve imports. +namespace margelo::nitro::test::external { struct SomeExternalObjectNumber; } // Include C++ defined types #include "HybridSomeExternalObjectSpec.hpp" +#include "SomeExternalObjectNumber.hpp" #include #include #include +#include #include // C++ helpers for Swift diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/ios/c++/HybridSomeExternalObjectSpecSwift.hpp b/packages/react-native-nitro-test-external/nitrogen/generated/ios/c++/HybridSomeExternalObjectSpecSwift.hpp index 9fa06c39e..780424efa 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/ios/c++/HybridSomeExternalObjectSpecSwift.hpp +++ b/packages/react-native-nitro-test-external/nitrogen/generated/ios/c++/HybridSomeExternalObjectSpecSwift.hpp @@ -12,9 +12,12 @@ // Forward declaration of `HybridSomeExternalObjectSpec_cxx` to properly resolve imports. namespace NitroTestExternal { class HybridSomeExternalObjectSpec_cxx; } - +// Forward declaration of `SomeExternalObjectNumber` to properly resolve imports. +namespace margelo::nitro::test::external { struct SomeExternalObjectNumber; } #include +#include "SomeExternalObjectNumber.hpp" +#include #include "NitroTestExternal-Swift-Cxx-Umbrella.hpp" @@ -68,6 +71,14 @@ namespace margelo::nitro::test::external { auto __value = std::move(__result.value()); return __value; } + inline SomeExternalObjectNumber getNumber(std::optional number) override { + auto __result = _swiftPart.getNumber(number); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; + } private: NitroTestExternal::HybridSomeExternalObjectSpec_cxx _swiftPart; diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/HybridSomeExternalObjectSpec.swift b/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/HybridSomeExternalObjectSpec.swift index 2681dcd54..c9519396e 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/HybridSomeExternalObjectSpec.swift +++ b/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/HybridSomeExternalObjectSpec.swift @@ -15,6 +15,7 @@ public protocol HybridSomeExternalObjectSpec_protocol: HybridObject { // Methods func getValue() throws -> String + func getNumber(number: Double?) throws -> SomeExternalObjectNumber } public extension HybridSomeExternalObjectSpec_protocol { diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/HybridSomeExternalObjectSpec_cxx.swift b/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/HybridSomeExternalObjectSpec_cxx.swift index b816d9a9b..05d0ff1c4 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/HybridSomeExternalObjectSpec_cxx.swift +++ b/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/HybridSomeExternalObjectSpec_cxx.swift @@ -128,4 +128,23 @@ open class HybridSomeExternalObjectSpec_cxx { return bridge.create_Result_std__string_(__exceptionPtr) } } + + @inline(__always) + public final func getNumber(number: bridge.std__optional_double_) -> bridge.Result_SomeExternalObjectNumber_ { + do { + let __result = try self.__implementation.getNumber(number: { () -> Double? in + if bridge.has_value_std__optional_double_(number) { + let __unwrapped = bridge.get_std__optional_double_(number) + return __unwrapped + } else { + return nil + } + }()) + let __resultCpp = __result + return bridge.create_Result_SomeExternalObjectNumber_(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_SomeExternalObjectNumber_(__exceptionPtr) + } + } } diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/SomeExternalObjectNumber.swift b/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/SomeExternalObjectNumber.swift new file mode 100644 index 000000000..b5f5679b8 --- /dev/null +++ b/packages/react-native-nitro-test-external/nitrogen/generated/ios/swift/SomeExternalObjectNumber.swift @@ -0,0 +1,55 @@ +/// +/// SomeExternalObjectNumber.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +import Foundation +import NitroModules + +/** + * Represents an instance of `SomeExternalObjectNumber`, backed by a C++ struct. + */ +public typealias SomeExternalObjectNumber = margelo.nitro.test.external.SomeExternalObjectNumber + +public extension SomeExternalObjectNumber { + private typealias bridge = margelo.nitro.test.external.bridge.swift + + /** + * Create a new instance of `SomeExternalObjectNumber`. + */ + init(number: Double?) { + self.init({ () -> bridge.std__optional_double_ in + if let __unwrappedValue = number { + return bridge.create_std__optional_double_(__unwrappedValue) + } else { + return .init() + } + }()) + } + + var number: Double? { + @inline(__always) + get { + return { () -> Double? in + if bridge.has_value_std__optional_double_(self.__number) { + let __unwrapped = bridge.get_std__optional_double_(self.__number) + return __unwrapped + } else { + return nil + } + }() + } + @inline(__always) + set { + self.__number = { () -> bridge.std__optional_double_ in + if let __unwrappedValue = newValue { + return bridge.create_std__optional_double_(__unwrappedValue) + } else { + return .init() + } + }() + } + } +} diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/HybridSomeExternalObjectSpec.cpp b/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/HybridSomeExternalObjectSpec.cpp index 782f8646c..2ff56c851 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/HybridSomeExternalObjectSpec.cpp +++ b/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/HybridSomeExternalObjectSpec.cpp @@ -15,6 +15,7 @@ namespace margelo::nitro::test::external { // load custom methods/properties registerHybrids(this, [](Prototype& prototype) { prototype.registerHybridMethod("getValue", &HybridSomeExternalObjectSpec::getValue); + prototype.registerHybridMethod("getNumber", &HybridSomeExternalObjectSpec::getNumber); }); } diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/HybridSomeExternalObjectSpec.hpp b/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/HybridSomeExternalObjectSpec.hpp index d6c42e43d..37d99ebe2 100644 --- a/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/HybridSomeExternalObjectSpec.hpp +++ b/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/HybridSomeExternalObjectSpec.hpp @@ -13,9 +13,12 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif - +// Forward declaration of `SomeExternalObjectNumber` to properly resolve imports. +namespace margelo::nitro::test::external { struct SomeExternalObjectNumber; } #include +#include "SomeExternalObjectNumber.hpp" +#include namespace margelo::nitro::test::external { @@ -49,6 +52,7 @@ namespace margelo::nitro::test::external { public: // Methods virtual std::string getValue() = 0; + virtual SomeExternalObjectNumber getNumber(std::optional number) = 0; protected: // Hybrid Setup diff --git a/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/SomeExternalObjectNumber.hpp b/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/SomeExternalObjectNumber.hpp new file mode 100644 index 000000000..279e6c096 --- /dev/null +++ b/packages/react-native-nitro-test-external/nitrogen/generated/shared/c++/SomeExternalObjectNumber.hpp @@ -0,0 +1,75 @@ +/// +/// SomeExternalObjectNumber.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © 2025 Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + + + +#include + +namespace margelo::nitro::test::external { + + /** + * A struct which can be represented as a JavaScript object (SomeExternalObjectNumber). + */ + struct SomeExternalObjectNumber final { + public: + std::optional number SWIFT_PRIVATE; + + public: + SomeExternalObjectNumber() = default; + explicit SomeExternalObjectNumber(std::optional number): number(number) {} + }; + +} // namespace margelo::nitro::test::external + +namespace margelo::nitro { + + // C++ SomeExternalObjectNumber <> JS SomeExternalObjectNumber (object) + template <> + struct JSIConverter final { + static inline margelo::nitro::test::external::SomeExternalObjectNumber fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return margelo::nitro::test::external::SomeExternalObjectNumber( + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, "number")) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::test::external::SomeExternalObjectNumber& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, "number", JSIConverter>::toJSI(runtime, arg.number)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!nitro::isPlainObject(runtime, obj)) { + return false; + } + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, "number"))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/packages/react-native-nitro-test-external/src/specs/SomeExternalObject.nitro.ts b/packages/react-native-nitro-test-external/src/specs/SomeExternalObject.nitro.ts index 82f60f85a..e2c42e613 100644 --- a/packages/react-native-nitro-test-external/src/specs/SomeExternalObject.nitro.ts +++ b/packages/react-native-nitro-test-external/src/specs/SomeExternalObject.nitro.ts @@ -1,5 +1,9 @@ import type { HybridObject } from 'react-native-nitro-modules' +export interface SomeExternalObjectNumber { + number?: number +} + /** * This hybrid object is implemented in Swift and Kotlin. * It can be called from Swift/Kotlin, as well as C++ directly. @@ -7,4 +11,5 @@ import type { HybridObject } from 'react-native-nitro-modules' export interface SomeExternalObject extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { getValue(): string + getNumber(number?: number): SomeExternalObjectNumber } diff --git a/packages/react-native-nitro-test/android/src/main/java/com/margelo/nitro/test/HybridSomeInternalObject.kt b/packages/react-native-nitro-test/android/src/main/java/com/margelo/nitro/test/HybridSomeInternalObject.kt index a74f0ce8c..a0a566ec8 100644 --- a/packages/react-native-nitro-test/android/src/main/java/com/margelo/nitro/test/HybridSomeInternalObject.kt +++ b/packages/react-native-nitro-test/android/src/main/java/com/margelo/nitro/test/HybridSomeInternalObject.kt @@ -3,9 +3,14 @@ package com.margelo.nitro.test import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip import com.margelo.nitro.test.external.HybridSomeExternalObjectSpec +import com.margelo.nitro.test.external.SomeExternalObjectNumber class HybridSomeInternalObject : HybridSomeExternalObjectSpec() { override fun getValue(): String { return "This is overridden!" } + + override fun getNumber(number: Double?): SomeExternalObjectNumber { + return SomeExternalObjectNumber(number = number) + } } diff --git a/packages/react-native-nitro-test/cpp/HybridSomeInternalObject.hpp b/packages/react-native-nitro-test/cpp/HybridSomeInternalObject.hpp index 0e3de8882..c30c7e220 100644 --- a/packages/react-native-nitro-test/cpp/HybridSomeInternalObject.hpp +++ b/packages/react-native-nitro-test/cpp/HybridSomeInternalObject.hpp @@ -12,6 +12,7 @@ namespace margelo::nitro::test { using namespace facebook; +using margelo::nitro::test::external::SomeExternalObjectNumber; class HybridSomeInternalObject : public virtual margelo::nitro::test::external::HybridSomeExternalObjectSpec { public: @@ -21,6 +22,10 @@ class HybridSomeInternalObject : public virtual margelo::nitro::test::external:: std::string getValue() override { return "This is overridden!"; } + + SomeExternalObjectNumber getNumber(std::optional number = std::nullopt) override { + return SomeExternalObjectNumber(number); +} }; }; // namespace margelo::nitro::test diff --git a/packages/react-native-nitro-test/ios/HybridSomeInternalObject.swift b/packages/react-native-nitro-test/ios/HybridSomeInternalObject.swift index 20b6a0280..dc78b1d7d 100644 --- a/packages/react-native-nitro-test/ios/HybridSomeInternalObject.swift +++ b/packages/react-native-nitro-test/ios/HybridSomeInternalObject.swift @@ -10,7 +10,14 @@ import NitroModules import NitroTestExternal class HybridSomeInternalObject: HybridSomeExternalObjectSpec { + func getValue() throws -> String { return "This is overridden!" } + + func getNumber(number: Double?) throws -> SomeExternalObjectNumber { + return SomeExternalObjectNumber( + number: number + ) + } } diff --git a/packages/react-native-nitro-test/nitrogen/generated/ios/swift/Func_void_std__optional_double_.swift b/packages/react-native-nitro-test/nitrogen/generated/ios/swift/Func_void_std__optional_double_.swift index b2090a9bb..40318e434 100644 --- a/packages/react-native-nitro-test/nitrogen/generated/ios/swift/Func_void_std__optional_double_.swift +++ b/packages/react-native-nitro-test/nitrogen/generated/ios/swift/Func_void_std__optional_double_.swift @@ -23,7 +23,14 @@ public final class Func_void_std__optional_double_ { @inline(__always) public func call(value: bridge.std__optional_double_) -> Void { - self.closure(value.value) + self.closure({ () -> Double? in + if bridge.has_value_std__optional_double_(value) { + let __unwrapped = bridge.get_std__optional_double_(value) + return __unwrapped + } else { + return nil + } + }()) } /** diff --git a/packages/react-native-nitro-test/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift b/packages/react-native-nitro-test/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift index b4438c0d6..231dfbfb0 100644 --- a/packages/react-native-nitro-test/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift +++ b/packages/react-native-nitro-test/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift @@ -1429,7 +1429,14 @@ open class HybridTestObjectSwiftKotlinSpec_cxx { @inline(__always) public final func callWithOptional(value: bridge.std__optional_double_, callback: bridge.Func_void_std__optional_double_) -> bridge.Result_void_ { do { - try self.__implementation.callWithOptional(value: value.value, callback: { () -> (Double?) -> Void in + try self.__implementation.callWithOptional(value: { () -> Double? in + if bridge.has_value_std__optional_double_(value) { + let __unwrapped = bridge.get_std__optional_double_(value) + return __unwrapped + } else { + return nil + } + }(), callback: { () -> (Double?) -> Void in let __wrappedFunction = bridge.wrap_Func_void_std__optional_double_(callback) return { (__maybe: Double?) -> Void in __wrappedFunction.call({ () -> bridge.std__optional_double_ in diff --git a/packages/react-native-nitro-test/nitrogen/generated/ios/swift/PartialPerson.swift b/packages/react-native-nitro-test/nitrogen/generated/ios/swift/PartialPerson.swift index be6b0f25e..70e6c9042 100644 --- a/packages/react-native-nitro-test/nitrogen/generated/ios/swift/PartialPerson.swift +++ b/packages/react-native-nitro-test/nitrogen/generated/ios/swift/PartialPerson.swift @@ -49,6 +49,26 @@ public extension PartialPerson { @inline(__always) var age: Double? { - return self.__age.value + @inline(__always) + get { + return { () -> Double? in + if bridge.has_value_std__optional_double_(self.__age) { + let __unwrapped = bridge.get_std__optional_double_(self.__age) + return __unwrapped + } else { + return nil + } + }() + } + @inline(__always) + set { + self.__age = { () -> bridge.std__optional_double_ in + if let __unwrappedValue = newValue { + return bridge.create_std__optional_double_(__unwrappedValue) + } else { + return .init() + } + }() + } } }