From 53ce247dbd702c2a728d309be10f6edb7dfabc89 Mon Sep 17 00:00:00 2001 From: Nick Lefever Date: Wed, 25 Jun 2025 18:28:22 -0700 Subject: [PATCH] Add codegen for MixedType diffing (#52266) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/52266 Native components may use `MixedType` properties in rare cases to hold untyped data. This diff adds support for serializing and prop diffing these types of props so that all of the props and object fields would be included in prop diffing results. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D77307169 fbshipit-source-id: ae6b00207ef857c9cfa4bdf9c235972915410a29 --- .../components/__snapshots__/GeneratePropsCpp-test.js.snap | 3 +++ .../components/__snapshots__/GeneratePropsCpp-test.js.snap | 3 +++ .../src/generators/components/GeneratePropsCpp.js | 4 ++++ .../src/generators/components/GeneratePropsH.js | 4 +--- .../__tests__/__snapshots__/GeneratePropsCpp-test.js.snap | 3 +++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/react-native-codegen/e2e/deep_imports/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/e2e/deep_imports/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap index 171674f0e90..0c0f3af3e22 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap +++ b/packages/react-native-codegen/e2e/deep_imports/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap @@ -737,6 +737,9 @@ folly::dynamic MixedPropNativeComponentViewProps::getDiffProps( } folly::dynamic result = HostPlatformViewProps::getDiffProps(prevProps); + if (mixedProp != oldProps->mixedProp) { + result[\\"mixedProp\\"] = mixedProp; + } return result; } #endif diff --git a/packages/react-native-codegen/e2e/namespaced/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/e2e/namespaced/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap index 524554979a7..31cf888ed2c 100644 --- a/packages/react-native-codegen/e2e/namespaced/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap +++ b/packages/react-native-codegen/e2e/namespaced/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap @@ -737,6 +737,9 @@ folly::dynamic MixedPropNativeComponentViewProps::getDiffProps( } folly::dynamic result = HostPlatformViewProps::getDiffProps(prevProps); + if (mixedProp != oldProps->mixedProp) { + result[\\"mixedProp\\"] = mixedProp; + } return result; } #endif diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js index 02ae98c71f6..5f5f5ea4377 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js @@ -152,6 +152,10 @@ function generatePropsDiffString( result["${prop.name}"] = toDynamic(${prop.name}); }`; case 'MixedTypeAnnotation': + return ` + if (${prop.name} != oldProps->${prop.name}) { + result["${prop.name}"] = ${prop.name}; + }`; default: // TODO: Implement diffProps for complex types return ''; diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js index 6c154a539b9..4fe83e16fad 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsH.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsH.js @@ -755,10 +755,8 @@ function generateStruct( case 'Int32TypeAnnotation': case 'DoubleTypeAnnotation': case 'FloatTypeAnnotation': - return `result["${name}"] = ${name};`; case 'MixedTypeAnnotation': - // MixedTypeAnnotation does not support prop diffing codegen - return ''; + return `result["${name}"] = ${name};`; default: return `result["${name}"] = ::facebook::react::toDynamic(${name});`; } diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap index 0c01fb666d2..47aa78b823a 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap @@ -1152,6 +1152,9 @@ folly::dynamic MixedPropNativeComponentProps::getDiffProps( } folly::dynamic result = HostPlatformViewProps::getDiffProps(prevProps); + if (mixedProp != oldProps->mixedProp) { + result[\\"mixedProp\\"] = mixedProp; + } return result; } #endif