From f144b5312263912d30a93f8d2cff9fbf7008174c Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Thu, 17 Apr 2025 14:25:22 -0700 Subject: [PATCH] Remove "usesMapBufferForStateData" template parameter from ConcreteShadowNode and ConcreteState Summary: These internals have leaked pretty far. As we are adding support for JNI reference state wrappers, lets hide this, and make functions for getting MapBuffer work automatically if state data exposes the requisite functions, instead of external users needing to worry about multiple possible `ConcreteState` types for a given state data type. Changelog: [Internal] Reviewed By: rshest Differential Revision: D73158627 fbshipit-source-id: e3ac2a045368d46fab72e2017fc28d680db6a7c0 --- .../renderer/components/text/ParagraphShadowNode.h | 3 +-- .../components/textinput/BaseTextInputShadowNode.h | 9 +++------ .../androidtextinput/AndroidTextInputShadowNode.h | 12 +++++------- .../components/view/ConcreteViewShadowNode.h | 9 +++------ .../react/renderer/core/ConcreteShadowNode.h | 5 ++--- .../ReactCommon/react/renderer/core/ConcreteState.h | 11 +++++++++-- 6 files changed, 23 insertions(+), 26 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h index 91839534d37..224299bc255 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h @@ -29,8 +29,7 @@ class ParagraphShadowNode final : public ConcreteViewShadowNode< ParagraphComponentName, ParagraphProps, ParagraphEventEmitter, - ParagraphState, - /* usesMapBufferForStateData */ true>, + ParagraphState>, public BaseTextShadowNode { public: using ConcreteViewShadowNode::ConcreteViewShadowNode; diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputShadowNode.h index 702b9f4aee8..ca450b3e0c6 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/BaseTextInputShadowNode.h @@ -29,22 +29,19 @@ template < const char* concreteComponentName, typename ViewPropsT, typename ViewEventEmitterT, - typename StateDataT, - bool usesMapBufferForStateData = false> + typename StateDataT> class BaseTextInputShadowNode : public ConcreteViewShadowNode< concreteComponentName, ViewPropsT, ViewEventEmitterT, - StateDataT, - usesMapBufferForStateData>, + StateDataT>, public BaseTextShadowNode { public: using BaseShadowNode = ConcreteViewShadowNode< concreteComponentName, ViewPropsT, ViewEventEmitterT, - StateDataT, - usesMapBufferForStateData>; + StateDataT>; using BaseShadowNode::ConcreteViewShadowNode; diff --git a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.h index 33c5bc22dd9..e21e30c7bca 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.h @@ -22,13 +22,11 @@ extern const char AndroidTextInputComponentName[]; /* * `ShadowNode` for component. */ -class AndroidTextInputShadowNode final - : public ConcreteViewShadowNode< - AndroidTextInputComponentName, - AndroidTextInputProps, - AndroidTextInputEventEmitter, - TextInputState, - /* usesMapBufferForStateData */ true> { +class AndroidTextInputShadowNode final : public ConcreteViewShadowNode< + AndroidTextInputComponentName, + AndroidTextInputProps, + AndroidTextInputEventEmitter, + TextInputState> { public: using ConcreteViewShadowNode::ConcreteViewShadowNode; diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/ConcreteViewShadowNode.h b/packages/react-native/ReactCommon/react/renderer/components/view/ConcreteViewShadowNode.h index 9c028febde0..84c855c1059 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/ConcreteViewShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/ConcreteViewShadowNode.h @@ -27,15 +27,13 @@ template < const char* concreteComponentName, typename ViewPropsT = ViewProps, typename ViewEventEmitterT = ViewEventEmitter, - typename StateDataT = StateData, - bool usesMapBufferForStateData = false> + typename StateDataT = StateData> class ConcreteViewShadowNode : public ConcreteShadowNode< concreteComponentName, YogaLayoutableShadowNode, ViewPropsT, ViewEventEmitterT, - StateDataT, - usesMapBufferForStateData> { + StateDataT> { static_assert( std::is_base_of::value, "ViewPropsT must be a descendant of ViewProps"); @@ -52,8 +50,7 @@ class ConcreteViewShadowNode : public ConcreteShadowNode< YogaLayoutableShadowNode, ViewPropsT, ViewEventEmitterT, - StateDataT, - usesMapBufferForStateData>; + StateDataT>; ConcreteViewShadowNode( const ShadowNodeFragment& fragment, diff --git a/packages/react-native/ReactCommon/react/renderer/core/ConcreteShadowNode.h b/packages/react-native/ReactCommon/react/renderer/core/ConcreteShadowNode.h index 684174a1586..4f3174c19a0 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ConcreteShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ConcreteShadowNode.h @@ -29,8 +29,7 @@ template < typename BaseShadowNodeT, typename PropsT, typename EventEmitterT = EventEmitter, - typename StateDataT = StateData, - bool usesMapBufferForStateData = false> + typename StateDataT = StateData> class ConcreteShadowNode : public BaseShadowNodeT { static_assert( std::is_base_of::value, @@ -52,7 +51,7 @@ class ConcreteShadowNode : public BaseShadowNodeT { using ConcreteEventEmitter = EventEmitterT; using SharedConcreteEventEmitter = std::shared_ptr; using SharedConcreteShadowNode = std::shared_ptr; - using ConcreteState = ConcreteState; + using ConcreteState = ConcreteState; using ConcreteStateData = StateDataT; static ComponentName Name() { diff --git a/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h b/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h index 46ac23f2fd8..1fab5de4940 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ConcreteState.h @@ -20,13 +20,20 @@ namespace facebook::react { +#ifdef ANDROID +template +concept StateDataWithMapBuffer = requires(StateDataT stateData) { + { stateData.getMapBuffer() } -> std::same_as; +}; +#endif + /* * Concrete and only template implementation of State interface. * State wraps an arbitrary data type and provides an interface to initiate a * state update transaction. A data object does not need to be copyable but * needs to be moveable. */ -template +template class ConcreteState : public State { public: using Shared = std::shared_ptr; @@ -106,7 +113,7 @@ class ConcreteState : public State { } MapBuffer getMapBuffer() const override { - if constexpr (usesMapBufferForStateData) { + if constexpr (StateDataWithMapBuffer) { return getData().getMapBuffer(); } else { return MapBufferBuilder::EMPTY();