From 1a5879e359530b7e6392cffd5df7c5f145504083 Mon Sep 17 00:00:00 2001 From: Marc Rousavy Date: Wed, 21 Oct 2026 15:31:48 +0200 Subject: [PATCH] perf(android): convert Fabric props directly into JNI --- packages/nitrogen/src/createPlatformSpec.ts | 9 +-- .../syntax/kotlin/types/KotlinStoredType.ts | 66 +++++++++++++++++++ .../views/kotlin/KotlinHybridViewManager.ts | 41 ++++++------ .../private/views/HybridTestViewComponent.hpp | 13 ++-- .../c++/views/HybridTestViewComponent.cpp | 4 +- .../c++/views/JHybridTestViewStateUpdater.cpp | 11 ++-- .../android/NitroTest+autolinking.cmake | 1 - .../c++/ColorScheme+Kotlin+NitroTest.cpp | 23 ------- .../private/ColorScheme+Kotlin+NitroTest.hpp | 22 ------- .../HybridRecyclableTestViewComponent.hpp | 11 +++- .../private/views/HybridTestViewComponent.hpp | 25 ++++--- .../HybridRecyclableTestViewComponent.cpp | 4 +- .../c++/views/HybridTestViewComponent.cpp | 12 ++-- .../JHybridRecyclableTestViewStateUpdater.cpp | 11 ++-- .../c++/views/JHybridTestViewStateUpdater.cpp | 28 ++++---- .../c++/include/NitroTest/ColorScheme.hpp | 64 ------------------ 16 files changed, 151 insertions(+), 194 deletions(-) create mode 100644 packages/nitrogen/src/syntax/kotlin/types/KotlinStoredType.ts delete mode 100644 tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/ColorScheme+Kotlin+NitroTest.cpp delete mode 100644 tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/ColorScheme+Kotlin+NitroTest.hpp delete mode 100644 tests/react-native/packages/react-native-nitro-test/nitrogen/generated/shared/c++/include/NitroTest/ColorScheme.hpp diff --git a/packages/nitrogen/src/createPlatformSpec.ts b/packages/nitrogen/src/createPlatformSpec.ts index 526a991d28..1c3a413329 100644 --- a/packages/nitrogen/src/createPlatformSpec.ts +++ b/packages/nitrogen/src/createPlatformSpec.ts @@ -162,14 +162,7 @@ export function getHybridObjectSpec( if (Node.isPropertyDeclaration(member)) { const memberType = member.getType() const isOptional = memberSymbol.isOptional() || memberType.getUnionTypes().some((unionType) => unionType.isUndefined()) - // Android Fabric props still use public C++ storage. - let propertyTarget: TypeParsingTarget - if (view && language === 'kotlin' && !member.isReadonly()) { - propertyTarget = { ...target, language: 'c++' } - } else { - propertyTarget = target - } - const propType = createType(propertyTarget, memberType, isOptional, member.getTypeNode()) + const propType = createType(target, memberType, isOptional, member.getTypeNode()) properties.push(new Property(memberName, propType, member.isReadonly())) } else if (Node.isMethodDeclaration(member)) { methods.push(new InstanceMethod(member, target)) diff --git a/packages/nitrogen/src/syntax/kotlin/types/KotlinStoredType.ts b/packages/nitrogen/src/syntax/kotlin/types/KotlinStoredType.ts new file mode 100644 index 0000000000..d3e1ed93ba --- /dev/null +++ b/packages/nitrogen/src/syntax/kotlin/types/KotlinStoredType.ts @@ -0,0 +1,66 @@ +import type { NitroConfig } from '../../../config/NitroConfig.js' +import type { Language } from '../../../getPlatformSpecs.js' +import type { SourceFile, SourceImport } from '../../SourceFile.js' +import type { GetCodeOptions, Type, TypeKind } from '../../types/Type.js' +import { wrapKotlinType } from '../wrapKotlinType.js' +import { convertJniValue, type KotlinType } from './KotlinType.js' + +/** A direct JNI value retained across native threads and Fabric props snapshots. */ +export class KotlinStoredType implements Type { + readonly type: KotlinType + + constructor(type: Type, config: NitroConfig) { + this.type = wrapKotlinType(type, { config: config }) + } + + get kind(): TypeKind { + return this.type.kind + } + + get isEquatable(): boolean { + return this.type.isEquatable + } + + getCode(language: Language, options: GetCodeOptions): string { + switch (language) { + case 'c++': { + if (this.type.jniValueKind === 'primitive') { + return this.type.getCode(language, options) + } + const jniClass = this.type.getCode(language, { ...options, context: 'type-argument' }) + const storedType = `jni::global_ref<${jniClass}>` + if (options.context === 'parameter') return `const ${storedType}&` + return storedType + } + default: + return this.type.getCode(language, options) + } + } + + /** Borrow an object, or adapt a scalar whose JavaScript ABI differs from JNI. */ + getJniValue(value: string): string { + if (this.type.jniValueKind === 'object') return `${value}.get()` + return convertJniValue(this.type, value, 'to-jni') + } + + getExtraFiles(): SourceFile[] { + return this.type.getExtraFiles() + } + + getRequiredImports(language: Language): SourceImport[] { + const imports = this.type.getRequiredImports(language) + switch (language) { + case 'c++': + if (this.type.jniValueKind === 'object') { + imports.push({ + language: language, + declaration: { header: 'NitroModules/JSIConverter+JNIGlobalRef.hpp', space: 'system' }, + }) + } + break + default: + break + } + return imports + } +} diff --git a/packages/nitrogen/src/views/kotlin/KotlinHybridViewManager.ts b/packages/nitrogen/src/views/kotlin/KotlinHybridViewManager.ts index b6c5fa7dc9..725c5eabd3 100644 --- a/packages/nitrogen/src/views/kotlin/KotlinHybridViewManager.ts +++ b/packages/nitrogen/src/views/kotlin/KotlinHybridViewManager.ts @@ -1,4 +1,4 @@ -import { wrapKotlinType } from '../../syntax/kotlin/wrapKotlinType.js' +import { getJniCode } from '../../syntax/kotlin/types/KotlinType.js' import type { SourceFile } from '../../syntax/SourceFile.js' import type { HybridObjectSpec } from '../../syntax/HybridObjectSpec.js' import { @@ -6,13 +6,15 @@ import { getViewComponentNames, getHybridViewComponentName, getHybridViewProperties, + type HybridViewPropertyStorage, } from '../CppHybridViewComponent.js' import { createFileMetadataString, escapeCppName } from '../../syntax/helpers.js' import { getHybridObjectName } from '../../syntax/getHybridObjectName.js' import { indent } from '../../utils.js' import { getImportsCode, getImportCode } from '../../syntax/getImportCode.js' import { getKotlinImplementation } from '../../syntax/kotlin/KotlinMethodHelpers.js' -import { createKotlinConverters, getKotlinConverter } from '../../syntax/kotlin/KotlinConverter.js' +import { KotlinInstanceMethod } from '../../syntax/kotlin/KotlinInstanceMethod.js' +import { KotlinStoredType } from '../../syntax/kotlin/types/KotlinStoredType.js' import { KotlinHybridViewType } from './KotlinHybridViewType.js' export function createKotlinHybridViewManager(spec: HybridObjectSpec<'kotlin'>): SourceFile[] { @@ -25,22 +27,19 @@ export function createKotlinHybridViewManager(spec: HybridObjectSpec<'kotlin'>): const implementation = getKotlinImplementation(spec) const viewImplementation = implementation.className const implementationImport = getImportCode(implementation.kotlinImport) - const viewProperties = getHybridViewProperties(spec) - const cppFiles = createViewComponentShadowNodeFiles(spec, { - platform: 'android', - properties: viewProperties.map(({ property, config }) => ({ property: property, config: config, type: property.type })), - }) - const propertyFiles = viewProperties.flatMap(({ property }) => property.type.getExtraFiles()) - const propertyConverters = viewProperties.map(({ property, config }) => createKotlinConverters(property.type, config)) - const converterFiles = propertyConverters.flatMap((converter) => converter.files) - const converterImports = propertyConverters.flatMap((converter) => converter.imports) + const viewProperties = getHybridViewProperties(spec).map(({ property, config }) => ({ + property: property, + config: config, + type: new KotlinStoredType(property.type, config), + })) satisfies readonly HybridViewPropertyStorage[] + const cppFiles = createViewComponentShadowNodeFiles(spec, { platform: 'android', properties: viewProperties }) + const propertyFiles = viewProperties.flatMap(({ type }) => type.getExtraFiles()) const componentName = getHybridViewComponentName(spec) const componentHeader = spec.config.getCxxHeader(`views/${component}.hpp`, 'private') const updaterHeader = spec.config.getCxxHeader(`views/J${stateUpdaterName}.hpp`, 'private') const updaterIncludes = getImportsCode([ { language: 'c++', declaration: updaterHeader }, { language: 'c++', declaration: componentHeader }, - ...converterImports, ]) const declarationIncludes = getImportsCode([ { @@ -222,18 +221,21 @@ public: } // namespace ${cxxNamespace} `.trim() - const propsUpdaterCalls = viewProperties.map(({ property, config }) => { + const propsUpdaterCalls = viewProperties.map(({ property, type }) => { const name = escapeCppName(property.name) - const setter = property.getSetterName('other') - const converter = getKotlinConverter({ - cppType: property.type, - kotlinType: wrapKotlinType(property.type, { config: config }), - }) + const setter = property.cppSetter + if (setter == null) { + throw new Error(`HybridView property ${spec.name}.${property.name} requires a setter.`) + } + const kotlinSetter = new KotlinInstanceMethod({ method: setter, accessor: { kind: 'setter', property: property } }) + const jniParameterType = getJniCode(type.type, { context: 'parameter', fullyQualified: true }) + const jniValue = type.getJniValue(`newProps->${name}.get()`) return ` if (oldProps == nullptr ? newProps->${name}.isProvided() : !newProps->${name}.hasSameValue(oldProps->${name})) { - hybridView->${setter}(${converter}::toJNI(newProps->${name}.get())); + static const auto __setter = ${JHybridTSpec}::JavaPart::javaClassStatic()->getMethod("${kotlinSetter.name}"); + __setter(javaView, ${jniValue}); } `.trim() }) @@ -318,7 +320,6 @@ void J${stateUpdaterName}::updateViewProps(jni::alias_ref /* class return [ ...cppFiles, ...propertyFiles, - ...converterFiles, { content: viewManagerCode, language: 'kotlin', diff --git a/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/include/NitroTestExternal/private/views/HybridTestViewComponent.hpp b/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/include/NitroTestExternal/private/views/HybridTestViewComponent.hpp index 154a070410..b66311e875 100644 --- a/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/include/NitroTestExternal/private/views/HybridTestViewComponent.hpp +++ b/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/include/NitroTestExternal/private/views/HybridTestViewComponent.hpp @@ -17,10 +17,15 @@ #include -#include -#include +#include +#include +#include +#include +#include #include #include +#include +#include #include namespace margelo::nitro::test::external::views { @@ -44,8 +49,8 @@ namespace margelo::nitro::test::external::views { const react::RawProps& rawProps); public: - nitro::ReactProp isBlue; - nitro::ReactProp> someCallback; + nitro::ReactProp isBlue; + nitro::ReactProp> someCallback; nitro::ReactProp& /* ref */)>>> hybridRef; [[nodiscard]] diff --git a/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/views/HybridTestViewComponent.cpp b/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/views/HybridTestViewComponent.cpp index 4a135774fd..81c88730c2 100644 --- a/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/views/HybridTestViewComponent.cpp +++ b/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/views/HybridTestViewComponent.cpp @@ -22,8 +22,8 @@ namespace margelo::nitro::test::external::views { const HybridTestViewProps& sourceProps, const react::RawProps& rawProps): react::ViewProps(context, sourceProps, rawProps, filterObjectKeys), - isBlue(nitro::ReactProp::fromRawValue("TestView", "isBlue", rawProps, sourceProps.isBlue)), - someCallback(nitro::ReactProp>::fromRawValue("TestView", "someCallback", rawProps, sourceProps.someCallback)), + isBlue(nitro::ReactProp::fromRawValue("TestView", "isBlue", rawProps, sourceProps.isBlue)), + someCallback(nitro::ReactProp>::fromRawValue("TestView", "someCallback", rawProps, sourceProps.someCallback)), hybridRef(nitro::ReactProp& /* ref */)>>>::fromRawValue("TestView", "hybridRef", rawProps, sourceProps.hybridRef)) { #ifdef ANDROID nitro::RawPropsCompat::initializeDynamicProps(*this, sourceProps, rawProps, filterObjectKeys); diff --git a/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/views/JHybridTestViewStateUpdater.cpp b/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/views/JHybridTestViewStateUpdater.cpp index aa2b0f8361..5b24452085 100644 --- a/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/views/JHybridTestViewStateUpdater.cpp +++ b/tests/react-native/packages/react-native-nitro-test-external/nitrogen/generated/android/c++/views/JHybridTestViewStateUpdater.cpp @@ -7,11 +7,6 @@ #include #include -#include -#include -#include -#include -#include #include #include #include @@ -71,12 +66,14 @@ void JHybridTestViewStateUpdater::updateViewProps(jni::alias_ref /* if (oldProps == nullptr ? newProps->isBlue.isProvided() : !newProps->isBlue.hasSameValue(oldProps->isBlue)) { - hybridView->setIsBlue(JNIConverter::toJNI(newProps->isBlue.get())); + static const auto __setter = JHybridTestViewSpec::JavaPart::javaClassStatic()->getMethod("setBlue"); + __setter(javaView, newProps->isBlue.get()); } if (oldProps == nullptr ? newProps->someCallback.isProvided() : !newProps->someCallback.hasSameValue(oldProps->someCallback)) { - hybridView->setSomeCallback(JNIConverter, jni::local_ref>::toJNI(newProps->someCallback.get())); + static const auto __setter = JHybridTestViewSpec::JavaPart::javaClassStatic()->getMethod)>("setSomeCallback_cxx"); + __setter(javaView, newProps->someCallback.get().get()); } if (oldProps == nullptr diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/NitroTest+autolinking.cmake b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/NitroTest+autolinking.cmake index 7dbd1e02e9..f827d42427 100644 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/NitroTest+autolinking.cmake +++ b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/NitroTest+autolinking.cmake @@ -13,7 +13,6 @@ target_include_directories(NitroTest PRIVATE ) target_sources(NitroTest PRIVATE "${CMAKE_CURRENT_LIST_DIR}/NitroTestOnLoad.cpp" - "${CMAKE_CURRENT_LIST_DIR}/../android/c++/ColorScheme+Kotlin+NitroTest.cpp" "${CMAKE_CURRENT_LIST_DIR}/../android/c++/HybridBenchmarkObjectCppSpecClass.cpp" "${CMAKE_CURRENT_LIST_DIR}/../android/c++/JCallback_double.cpp" "${CMAKE_CURRENT_LIST_DIR}/../android/c++/JCallback_void.cpp" diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/ColorScheme+Kotlin+NitroTest.cpp b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/ColorScheme+Kotlin+NitroTest.cpp deleted file mode 100644 index 0d8e2af8a2..0000000000 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/ColorScheme+Kotlin+NitroTest.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/// -/// ColorScheme+Kotlin+NitroTest.cpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/margelo/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -#include -#include -#include -#include - -namespace margelo::nitro { - - jni::local_ref JNIConverter>::toJNI(const margelo::nitro::test::ColorScheme& value) { - return margelo::nitro::test::JColorScheme::fromValue(static_cast(value)); - } - - margelo::nitro::test::ColorScheme JNIConverter>::fromJNI(jni::alias_ref value) { - return static_cast(value->value()); - } - -} // namespace margelo::nitro diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/ColorScheme+Kotlin+NitroTest.hpp b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/ColorScheme+Kotlin+NitroTest.hpp deleted file mode 100644 index 749f04d474..0000000000 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/ColorScheme+Kotlin+NitroTest.hpp +++ /dev/null @@ -1,22 +0,0 @@ -/// -/// ColorScheme+Kotlin+NitroTest.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/margelo/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -#pragma once - -#include -#include -#include - -namespace margelo::nitro { - - template <> - struct JNIConverter> final { - static jni::local_ref toJNI(const margelo::nitro::test::ColorScheme& value); - static margelo::nitro::test::ColorScheme fromJNI(jni::alias_ref value); - }; - -} // namespace margelo::nitro diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/views/HybridRecyclableTestViewComponent.hpp b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/views/HybridRecyclableTestViewComponent.hpp index b7ddfbe4d0..aa2285e7bd 100644 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/views/HybridRecyclableTestViewComponent.hpp +++ b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/views/HybridRecyclableTestViewComponent.hpp @@ -17,11 +17,16 @@ #include -#include +#include +#include +#include +#include +#include #include #include #include #include +#include namespace margelo::nitro::test::views { @@ -44,8 +49,8 @@ namespace margelo::nitro::test::views { const react::RawProps& rawProps); public: - nitro::ReactProp isBlue; - nitro::ReactProp> nativeDefaultValue; + nitro::ReactProp isBlue; + nitro::ReactProp>> nativeDefaultValue; nitro::ReactProp& /* ref */)>>> hybridRef; [[nodiscard]] diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/views/HybridTestViewComponent.hpp b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/views/HybridTestViewComponent.hpp index e3a499dc9d..0b2c9d2f18 100644 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/views/HybridTestViewComponent.hpp +++ b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/include/NitroTest/private/views/HybridTestViewComponent.hpp @@ -17,12 +17,19 @@ #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include -#include -#include namespace margelo::nitro::test::views { @@ -45,12 +52,12 @@ namespace margelo::nitro::test::views { const react::RawProps& rawProps); public: - nitro::ReactProp isBlue; - nitro::ReactProp hasBeenCalled; - nitro::ReactProp int64Value; - nitro::ReactProp colorScheme; - nitro::ReactProp> someCallback; - nitro::ReactProp> nativeDefaultValue; + nitro::ReactProp isBlue; + nitro::ReactProp hasBeenCalled; + nitro::ReactProp int64Value; + nitro::ReactProp> colorScheme; + nitro::ReactProp> someCallback; + nitro::ReactProp>> nativeDefaultValue; nitro::ReactProp& /* ref */)>>> hybridRef; [[nodiscard]] diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/HybridRecyclableTestViewComponent.cpp b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/HybridRecyclableTestViewComponent.cpp index 1bccf736f5..10a1f65010 100644 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/HybridRecyclableTestViewComponent.cpp +++ b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/HybridRecyclableTestViewComponent.cpp @@ -22,8 +22,8 @@ namespace margelo::nitro::test::views { const HybridRecyclableTestViewProps& sourceProps, const react::RawProps& rawProps): react::ViewProps(context, sourceProps, rawProps, filterObjectKeys), - isBlue(nitro::ReactProp::fromRawValue("RecyclableTestView", "isBlue", rawProps, sourceProps.isBlue)), - nativeDefaultValue(nitro::ReactProp>::fromRawValue("RecyclableTestView", "nativeDefaultValue", rawProps, sourceProps.nativeDefaultValue)), + isBlue(nitro::ReactProp::fromRawValue("RecyclableTestView", "isBlue", rawProps, sourceProps.isBlue)), + nativeDefaultValue(nitro::ReactProp>>::fromRawValue("RecyclableTestView", "nativeDefaultValue", rawProps, sourceProps.nativeDefaultValue)), hybridRef(nitro::ReactProp& /* ref */)>>>::fromRawValue("RecyclableTestView", "hybridRef", rawProps, sourceProps.hybridRef)) { #ifdef ANDROID nitro::RawPropsCompat::initializeDynamicProps(*this, sourceProps, rawProps, filterObjectKeys); diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/HybridTestViewComponent.cpp b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/HybridTestViewComponent.cpp index 51bdc6e1d6..748d07b04d 100644 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/HybridTestViewComponent.cpp +++ b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/HybridTestViewComponent.cpp @@ -22,12 +22,12 @@ namespace margelo::nitro::test::views { const HybridTestViewProps& sourceProps, const react::RawProps& rawProps): react::ViewProps(context, sourceProps, rawProps, filterObjectKeys), - isBlue(nitro::ReactProp::fromRawValue("TestView", "isBlue", rawProps, sourceProps.isBlue)), - hasBeenCalled(nitro::ReactProp::fromRawValue("TestView", "hasBeenCalled", rawProps, sourceProps.hasBeenCalled)), - int64Value(nitro::ReactProp::fromRawValue("TestView", "int64Value", rawProps, sourceProps.int64Value)), - colorScheme(nitro::ReactProp::fromRawValue("TestView", "colorScheme", rawProps, sourceProps.colorScheme)), - someCallback(nitro::ReactProp>::fromRawValue("TestView", "someCallback", rawProps, sourceProps.someCallback)), - nativeDefaultValue(nitro::ReactProp>::fromRawValue("TestView", "nativeDefaultValue", rawProps, sourceProps.nativeDefaultValue)), + isBlue(nitro::ReactProp::fromRawValue("TestView", "isBlue", rawProps, sourceProps.isBlue)), + hasBeenCalled(nitro::ReactProp::fromRawValue("TestView", "hasBeenCalled", rawProps, sourceProps.hasBeenCalled)), + int64Value(nitro::ReactProp::fromRawValue("TestView", "int64Value", rawProps, sourceProps.int64Value)), + colorScheme(nitro::ReactProp>::fromRawValue("TestView", "colorScheme", rawProps, sourceProps.colorScheme)), + someCallback(nitro::ReactProp>::fromRawValue("TestView", "someCallback", rawProps, sourceProps.someCallback)), + nativeDefaultValue(nitro::ReactProp>>::fromRawValue("TestView", "nativeDefaultValue", rawProps, sourceProps.nativeDefaultValue)), hybridRef(nitro::ReactProp& /* ref */)>>>::fromRawValue("TestView", "hybridRef", rawProps, sourceProps.hybridRef)) { #ifdef ANDROID nitro::RawPropsCompat::initializeDynamicProps(*this, sourceProps, rawProps, filterObjectKeys); diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/JHybridRecyclableTestViewStateUpdater.cpp b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/JHybridRecyclableTestViewStateUpdater.cpp index 3d65234b0b..36affb3917 100644 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/JHybridRecyclableTestViewStateUpdater.cpp +++ b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/JHybridRecyclableTestViewStateUpdater.cpp @@ -7,11 +7,6 @@ #include #include -#include -#include -#include -#include -#include #include #include #include @@ -71,12 +66,14 @@ void JHybridRecyclableTestViewStateUpdater::updateViewProps(jni::alias_refisBlue.isProvided() : !newProps->isBlue.hasSameValue(oldProps->isBlue)) { - hybridView->setIsBlue(JNIConverter::toJNI(newProps->isBlue.get())); + static const auto __setter = JHybridRecyclableTestViewSpec::JavaPart::javaClassStatic()->getMethod("setBlue"); + __setter(javaView, newProps->isBlue.get()); } if (oldProps == nullptr ? newProps->nativeDefaultValue.isProvided() : !newProps->nativeDefaultValue.hasSameValue(oldProps->nativeDefaultValue)) { - hybridView->setNativeDefaultValue(JNIConverter, jni::local_ref>>::toJNI(newProps->nativeDefaultValue.get())); + static const auto __setter = JHybridRecyclableTestViewSpec::JavaPart::javaClassStatic()->getMethod>)>("setNativeDefaultValue"); + __setter(javaView, newProps->nativeDefaultValue.get().get()); } if (oldProps == nullptr diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/JHybridTestViewStateUpdater.cpp b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/JHybridTestViewStateUpdater.cpp index e0a5d6d93b..0fafb2b0c7 100644 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/JHybridTestViewStateUpdater.cpp +++ b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/android/c++/views/JHybridTestViewStateUpdater.cpp @@ -7,16 +7,6 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include #include @@ -76,32 +66,38 @@ void JHybridTestViewStateUpdater::updateViewProps(jni::alias_ref /* if (oldProps == nullptr ? newProps->isBlue.isProvided() : !newProps->isBlue.hasSameValue(oldProps->isBlue)) { - hybridView->setIsBlue(JNIConverter::toJNI(newProps->isBlue.get())); + static const auto __setter = JHybridTestViewSpec::JavaPart::javaClassStatic()->getMethod("setBlue"); + __setter(javaView, newProps->isBlue.get()); } if (oldProps == nullptr ? newProps->hasBeenCalled.isProvided() : !newProps->hasBeenCalled.hasSameValue(oldProps->hasBeenCalled)) { - hybridView->setHasBeenCalled(JNIConverter::toJNI(newProps->hasBeenCalled.get())); + static const auto __setter = JHybridTestViewSpec::JavaPart::javaClassStatic()->getMethod("setHasBeenCalled"); + __setter(javaView, newProps->hasBeenCalled.get()); } if (oldProps == nullptr ? newProps->int64Value.isProvided() : !newProps->int64Value.hasSameValue(oldProps->int64Value)) { - hybridView->setInt64Value(JNIConverter::toJNI(newProps->int64Value.get())); + static const auto __setter = JHybridTestViewSpec::JavaPart::javaClassStatic()->getMethod("setInt64Value"); + __setter(javaView, newProps->int64Value.get()); } if (oldProps == nullptr ? newProps->colorScheme.isProvided() : !newProps->colorScheme.hasSameValue(oldProps->colorScheme)) { - hybridView->setColorScheme(JNIConverter>::toJNI(newProps->colorScheme.get())); + static const auto __setter = JHybridTestViewSpec::JavaPart::javaClassStatic()->getMethod)>("setColorScheme"); + __setter(javaView, newProps->colorScheme.get().get()); } if (oldProps == nullptr ? newProps->someCallback.isProvided() : !newProps->someCallback.hasSameValue(oldProps->someCallback)) { - hybridView->setSomeCallback(JNIConverter, jni::local_ref>::toJNI(newProps->someCallback.get())); + static const auto __setter = JHybridTestViewSpec::JavaPart::javaClassStatic()->getMethod)>("setSomeCallback_cxx"); + __setter(javaView, newProps->someCallback.get().get()); } if (oldProps == nullptr ? newProps->nativeDefaultValue.isProvided() : !newProps->nativeDefaultValue.hasSameValue(oldProps->nativeDefaultValue)) { - hybridView->setNativeDefaultValue(JNIConverter, jni::local_ref>>::toJNI(newProps->nativeDefaultValue.get())); + static const auto __setter = JHybridTestViewSpec::JavaPart::javaClassStatic()->getMethod>)>("setNativeDefaultValue"); + __setter(javaView, newProps->nativeDefaultValue.get().get()); } if (oldProps == nullptr diff --git a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/shared/c++/include/NitroTest/ColorScheme.hpp b/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/shared/c++/include/NitroTest/ColorScheme.hpp deleted file mode 100644 index 8f643a2e92..0000000000 --- a/tests/react-native/packages/react-native-nitro-test/nitrogen/generated/shared/c++/include/NitroTest/ColorScheme.hpp +++ /dev/null @@ -1,64 +0,0 @@ -/// -/// ColorScheme.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/margelo/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -#pragma once - -#include -#include -#include - -namespace margelo::nitro::test { - - /** - * An enum which can be represented as a JavaScript union (ColorScheme). - */ - enum class ColorScheme { - LIGHT SWIFT_NAME(light) = 0, - DARK SWIFT_NAME(dark) = 1, - } CLOSED_ENUM; - -} // namespace margelo::nitro::test - -namespace margelo::nitro { - - // C++ ColorScheme <> JS ColorScheme (union) - template <> - struct JSIConverter final { - static inline margelo::nitro::test::ColorScheme fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - std::string unionValue = JSIConverter::fromJSI(runtime, arg); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("light"): return margelo::nitro::test::ColorScheme::LIGHT; - case hashString("dark"): return margelo::nitro::test::ColorScheme::DARK; - default: [[unlikely]] - throw std::invalid_argument("Cannot convert \"" + unionValue + "\" to enum ColorScheme - invalid value!"); - } - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, margelo::nitro::test::ColorScheme arg) { - switch (arg) { - case margelo::nitro::test::ColorScheme::LIGHT: return JSIConverter::toJSI(runtime, "light"); - case margelo::nitro::test::ColorScheme::DARK: return JSIConverter::toJSI(runtime, "dark"); - default: [[unlikely]] - throw std::invalid_argument("Cannot convert ColorScheme to JS - invalid value: " - + std::to_string(static_cast(arg)) + "!"); - } - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isString()) { - return false; - } - std::string unionValue = JSIConverter::fromJSI(runtime, value); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("light"): - case hashString("dark"): - return true; - default: - return false; - } - } - }; - -} // namespace margelo::nitro