Skip to content

Commit 8c806ec

Browse files
Nick Lefeverfacebook-github-bot
authored andcommitted
Add codegen for DimensionType diffing (#52242)
Summary: Pull Request resolved: #52242 Codegen supports `DimensionType` props which represents a YGValue. This diff adds a conversion to `folly::dynamic` supporting all the existing value types `YGValue` can represent. This completes codegen support for all allowed `ReservedPropTypeAnnotation` prop types. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D77234061 fbshipit-source-id: 6c3aef5e3ab0459d8a68ebd8efaccfecb83b0b08
1 parent a164874 commit 8c806ec

10 files changed

Lines changed: 47 additions & 3 deletions

File tree

packages/react-native-codegen/e2e/deep_imports/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ folly::dynamic DimensionPropNativeComponentViewProps::getDiffProps(
213213
}
214214
folly::dynamic result = HostPlatformViewProps::getDiffProps(prevProps);
215215
216+
if (marginBack != oldProps->marginBack) {
217+
result[\\"marginBack\\"] = toDynamic(marginBack);
218+
}
216219
return result;
217220
}
218221
#endif

packages/react-native-codegen/e2e/deep_imports/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Object {
1616
#include <cinttypes>
1717
#include <react/renderer/components/view/ViewProps.h>
1818
#include <react/renderer/core/PropsParserContext.h>
19+
#include <react/renderer/core/graphicsConversions.h>
1920
#include <react/renderer/core/propsConversions.h>
2021
#include <react/renderer/graphics/Color.h>
2122
#include <react/renderer/graphics/Point.h>
@@ -265,6 +266,7 @@ Object {
265266
266267
#include <react/renderer/components/view/ViewProps.h>
267268
#include <react/renderer/core/PropsParserContext.h>
269+
#include <react/renderer/core/graphicsConversions.h>
268270
#include <yoga/Yoga.h>
269271
270272
namespace facebook::react {

packages/react-native-codegen/e2e/namespaced/__tests__/components/__snapshots__/GeneratePropsCpp-test.js.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ folly::dynamic DimensionPropNativeComponentViewProps::getDiffProps(
213213
}
214214
folly::dynamic result = HostPlatformViewProps::getDiffProps(prevProps);
215215
216+
if (marginBack != oldProps->marginBack) {
217+
result[\\"marginBack\\"] = toDynamic(marginBack);
218+
}
216219
return result;
217220
}
218221
#endif

packages/react-native-codegen/e2e/namespaced/__tests__/components/__snapshots__/GeneratePropsH-test.js.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Object {
1616
#include <cinttypes>
1717
#include <react/renderer/components/view/ViewProps.h>
1818
#include <react/renderer/core/PropsParserContext.h>
19+
#include <react/renderer/core/graphicsConversions.h>
1920
#include <react/renderer/core/propsConversions.h>
2021
#include <react/renderer/graphics/Color.h>
2122
#include <react/renderer/graphics/Point.h>
@@ -265,6 +266,7 @@ Object {
265266
266267
#include <react/renderer/components/view/ViewProps.h>
267268
#include <react/renderer/core/PropsParserContext.h>
269+
#include <react/renderer/core/graphicsConversions.h>
268270
#include <yoga/Yoga.h>
269271
270272
namespace facebook::react {

packages/react-native-codegen/src/generators/components/ComponentsGeneratorUtils.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ function getLocalImports(
245245
return;
246246
case 'DimensionPrimitive':
247247
imports.add('#include <yoga/Yoga.h>');
248+
imports.add('#include <react/renderer/core/graphicsConversions.h>');
248249
return;
249250
default:
250251
(name: empty);

packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,10 @@ function generatePropsDiffString(
123123
result["${prop.name}"] = toDynamic(${prop.name});
124124
}`;
125125
case 'DimensionPrimitive':
126-
// TODO: Implement diffProps for complex types
127-
return '';
126+
return `
127+
if (${prop.name} != oldProps->${prop.name}) {
128+
result["${prop.name}"] = toDynamic(${prop.name});
129+
}`;
128130
default:
129131
(typeAnnotation.name: empty);
130132
throw new Error('Received unknown ReservedPropTypeAnnotation');

packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,9 @@ folly::dynamic DimensionPropNativeComponentProps::getDiffProps(
349349
}
350350
folly::dynamic result = HostPlatformViewProps::getDiffProps(prevProps);
351351
352+
if (marginBack != oldProps->marginBack) {
353+
result[\\"marginBack\\"] = toDynamic(marginBack);
354+
}
352355
return result;
353356
}
354357
#endif

packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsH-test.js.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Map {
1616
#include <cinttypes>
1717
#include <react/renderer/components/view/ViewProps.h>
1818
#include <react/renderer/core/PropsParserContext.h>
19+
#include <react/renderer/core/graphicsConversions.h>
1920
#include <react/renderer/core/propsConversions.h>
2021
#include <react/renderer/graphics/Color.h>
2122
#include <react/renderer/graphics/Point.h>
@@ -469,6 +470,7 @@ Map {
469470
470471
#include <react/renderer/components/view/ViewProps.h>
471472
#include <react/renderer/core/PropsParserContext.h>
473+
#include <react/renderer/core/graphicsConversions.h>
472474
#include <yoga/Yoga.h>
473475
474476
namespace facebook::react {

packages/react-native/ReactCommon/react/renderer/core/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ target_link_libraries(react_renderer_core
2424
react_renderer_mapbuffer
2525
react_renderer_runtimescheduler
2626
react_utils
27-
runtimeexecutor)
27+
runtimeexecutor
28+
yoga)
2829
target_compile_reactnative_options(react_renderer_core PRIVATE)
2930
target_compile_options(react_renderer_core PRIVATE -Wpedantic)

packages/react-native/ReactCommon/react/renderer/core/graphicsConversions.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
#include <react/renderer/graphics/RectangleEdges.h>
2525
#include <react/renderer/graphics/Size.h>
2626

27+
#ifdef RN_SERIALIZABLE_STATE
28+
#include <yoga/Yoga.h>
29+
#endif
30+
2731
namespace facebook::react {
2832

2933
#pragma mark - Color
@@ -61,6 +65,27 @@ inline std::string toString(const SharedColor& value) {
6165
#pragma mark - Geometry
6266

6367
#ifdef RN_SERIALIZABLE_STATE
68+
inline folly::dynamic toDynamic(const YGValue& dimension) {
69+
switch (dimension.unit) {
70+
case YGUnitUndefined:
71+
return nullptr;
72+
case YGUnitAuto:
73+
return "auto";
74+
case YGUnitMaxContent:
75+
return "max-content";
76+
case YGUnitFitContent:
77+
return "fit-content";
78+
case YGUnitStretch:
79+
return "stretch";
80+
case YGUnitPoint:
81+
return dimension.value;
82+
case YGUnitPercent:
83+
return std::format("{}%", dimension.value);
84+
}
85+
86+
return nullptr;
87+
}
88+
6489
inline folly::dynamic toDynamic(const Point& point) {
6590
folly::dynamic pointResult = folly::dynamic::object();
6691
pointResult["x"] = point.x;

0 commit comments

Comments
 (0)