From 73b2d25d45fd9b191bf50b44695650378300169b Mon Sep 17 00:00:00 2001 From: Gregory Moskaliuk Date: Wed, 21 Oct 2026 03:06:11 +0200 Subject: [PATCH 1/2] Use a static cast for View nodes when building ShadowView layout metrics Co-Authored-By: Claude Opus 5.5 --- .../ReactCommon/react/renderer/mounting/ShadowView.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp index d59525e87492..84a14225cab3 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp +++ b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp @@ -13,6 +13,12 @@ namespace facebook::react { static LayoutMetrics layoutMetricsFromShadowNode(const ShadowNode& shadowNode) { + // A node with the `ViewKind` trait inherits `ConcreteViewShadowNode`, so it + // is a `LayoutableShadowNode`; only other nodes need the checked cast. + if (shadowNode.getTraits().check(ShadowNodeTraits::Trait::ViewKind)) { + return static_cast(shadowNode) + .getLayoutMetrics(); + } auto layoutableShadowNode = dynamic_cast(&shadowNode); return layoutableShadowNode != nullptr From d93cf529f9790e30818f01a9b2efcb5c4a21a3b2 Mon Sep 17 00:00:00 2001 From: Gregory Moskaliuk Date: Wed, 21 Oct 2026 17:12:55 +0200 Subject: [PATCH 2/2] Use a virtual accessor instead of the ViewKind check for layout metrics `ViewKind` is only a convention: a component can set the trait without inheriting `ConcreteViewShadowNode`. Instead of relying on it, add a virtual `ShadowNode::asLayoutable()` that `LayoutableShadowNode` overrides, and use it in `layoutMetricsFromShadowNode` in place of the `dynamic_cast` for every node. Mark `LayoutableShadowNode::getDebugProps` as `override`, which clang requires once the class has another `override`, and add the new method to the C++ API snapshots. Co-Authored-By: Claude Opus 5.5 --- .../react/renderer/core/LayoutableShadowNode.h | 7 ++++++- .../ReactCommon/react/renderer/core/ShadowNode.h | 10 ++++++++++ .../ReactCommon/react/renderer/mounting/ShadowView.cpp | 9 +-------- scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api | 2 ++ .../api-snapshots/ReactAndroidFrameworksCxx.api | 2 ++ .../cxx-api/api-snapshots/ReactAndroidNewarchCxx.api | 2 ++ .../cxx-api/api-snapshots/ReactAndroidReleaseCxx.api | 2 ++ scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api | 2 ++ .../cxx-api/api-snapshots/ReactAppleFrameworksCxx.api | 2 ++ scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api | 2 ++ scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api | 2 ++ scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api | 2 ++ .../cxx-api/api-snapshots/ReactCommonFrameworksCxx.api | 2 ++ .../cxx-api/api-snapshots/ReactCommonNewarchCxx.api | 2 ++ .../cxx-api/api-snapshots/ReactCommonReleaseCxx.api | 2 ++ 15 files changed, 41 insertions(+), 9 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.h b/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.h index 8655de5f396e..2fdf36483d89 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.h @@ -117,6 +117,11 @@ class LayoutableShadowNode : public ShadowNode { */ LayoutMetrics getLayoutMetrics() const; + const LayoutableShadowNode *asLayoutable() const override + { + return this; + } + /* * Returns a transform object that represents transformations that will/should * be applied on top of regular layout metrics by mounting layer. @@ -170,7 +175,7 @@ class LayoutableShadowNode : public ShadowNode { #pragma mark - DebugStringConvertible #if RN_DEBUG_STRING_CONVERTIBLE - SharedDebugStringConvertibleList getDebugProps() const; + SharedDebugStringConvertibleList getDebugProps() const override; #endif LayoutMetrics layoutMetrics_; diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h index 2426c9065fc8..b21cb21b4f3b 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h @@ -27,6 +27,7 @@ namespace facebook::react { class ComponentDescriptor; +class LayoutableShadowNode; struct ShadowNodeFragment; struct ShadowNodeWrapper; @@ -122,6 +123,15 @@ class ShadowNode : public Sealable, public DebugStringConvertible, public jsi::N */ virtual void completeClone(const ShadowNode & /* sourceShadowNode */, const ShadowNodeFragment & /* fragment */) {} + /** + * Returns this node as a `LayoutableShadowNode`, or `nullptr` if it isn't + * one. Cheaper than a `dynamic_cast`. + */ + virtual const LayoutableShadowNode *asLayoutable() const + { + return nullptr; + } + #pragma mark - Getters ComponentName getComponentName() const; diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp index 84a14225cab3..1f4a7e0aa2a6 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp +++ b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp @@ -13,14 +13,7 @@ namespace facebook::react { static LayoutMetrics layoutMetricsFromShadowNode(const ShadowNode& shadowNode) { - // A node with the `ViewKind` trait inherits `ConcreteViewShadowNode`, so it - // is a `LayoutableShadowNode`; only other nodes need the checked cast. - if (shadowNode.getTraits().check(ShadowNodeTraits::Trait::ViewKind)) { - return static_cast(shadowNode) - .getLayoutMetrics(); - } - auto layoutableShadowNode = - dynamic_cast(&shadowNode); + auto layoutableShadowNode = shadowNode.asLayoutable(); return layoutableShadowNode != nullptr ? layoutableShadowNode->getLayoutMetrics() : EmptyLayoutMetrics; diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api index 7579a261eb06..e6754f68de84 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api @@ -1718,6 +1718,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -2249,6 +2250,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api index 69efb6e2de07..e0ff4286eb92 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api @@ -2588,6 +2588,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -3633,6 +3634,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api index 3b07cc3df7c8..f2ac26ddaeed 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api @@ -1717,6 +1717,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -2242,6 +2243,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api index 3b07cc3df7c8..f2ac26ddaeed 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api @@ -1717,6 +1717,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -2242,6 +2243,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index cd7cd6ba81f9..0afcd995b2ff 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -4002,6 +4002,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -4510,6 +4511,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api index a21ebf068233..1b546bf54b9b 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api @@ -4807,6 +4807,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -5843,6 +5844,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api index aab9559c8f36..e26762724848 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api @@ -3993,6 +3993,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -4495,6 +4496,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 47e70d959eb1..5f21f38534ce 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -4001,6 +4001,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -4503,6 +4504,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api index b8735f0528a1..cd608ca12bc3 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api @@ -843,6 +843,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; public virtual facebook::react::Size measureContent(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -1057,6 +1058,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api index 7933bdb1a433..3af81ac70318 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api @@ -1523,6 +1523,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; public virtual facebook::react::Size measureContent(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -2230,6 +2231,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api index 6b1ebcc6d520..1da6bfffd246 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api @@ -842,6 +842,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; public virtual facebook::react::Size measureContent(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -1050,6 +1051,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api index 6b1ebcc6d520..1da6bfffd246 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api @@ -842,6 +842,7 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; public virtual facebook::react::Size measureContent(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -1050,6 +1051,7 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; + public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max());