From c583822504321d99c610522223be209244744dad Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Fri, 1 Nov 2019 09:35:40 -0700 Subject: [PATCH] Fabric: Introducing `RCTComponentViewClassDescriptor` Summary: RCTComponentViewClassDescriptor is a pretty much the same as RCTComponentViewDescriptor but for *classes*. RCTComponentViewFactory uses a map of those data structures to create RCTComponentViewDescriptor instances (which reflects the same properties) efficiently. Changelog: [Internal] Fabric-specific internal change. Reviewed By: sammy-SC Differential Revision: D18217103 fbshipit-source-id: ab7ab6b0712048d0085b61a3604b284b1fb5a68b --- .../RCTComponentViewClassDescriptor.h | 25 +++++++++++++++++++ .../Mounting/RCTComponentViewFactory.mm | 19 ++++++++++---- 2 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 React/Fabric/Mounting/RCTComponentViewClassDescriptor.h diff --git a/React/Fabric/Mounting/RCTComponentViewClassDescriptor.h b/React/Fabric/Mounting/RCTComponentViewClassDescriptor.h new file mode 100644 index 0000000000..52a6cc7d9c --- /dev/null +++ b/React/Fabric/Mounting/RCTComponentViewClassDescriptor.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +/* + * Holds a native view class and a set of attributes associated with it. + */ +class RCTComponentViewClassDescriptor final { + public: + /* + * Associated (and owned) native view class. + */ + Class viewClass; +}; + +NS_ASSUME_NONNULL_END diff --git a/React/Fabric/Mounting/RCTComponentViewFactory.mm b/React/Fabric/Mounting/RCTComponentViewFactory.mm index 53f2eebdf7..e2ab8f9189 100644 --- a/React/Fabric/Mounting/RCTComponentViewFactory.mm +++ b/React/Fabric/Mounting/RCTComponentViewFactory.mm @@ -17,6 +17,7 @@ #import "RCTARTSurfaceViewComponentView.h" #import "RCTActivityIndicatorViewComponentView.h" +#import "RCTComponentViewClassDescriptor.h" #import "RCTImageComponentView.h" #import "RCTLegacyViewManagerInteropComponentView.h" #import "RCTModalHostViewComponentView.h" @@ -33,7 +34,7 @@ using namespace facebook::react; @implementation RCTComponentViewFactory { - better::map> _componentViewClasses; + better::map _componentViewClasses; ComponentDescriptorProviderRegistry _providerRegistry; better::shared_mutex _mutex; } @@ -68,19 +69,26 @@ using namespace facebook::react; providerRegistry->add(ComponentDescriptorProvider{componentHandle, componentName, flavor, constructor}); - componentViewFactory->_componentViewClasses[componentHandle] = [RCTLegacyViewManagerInteropComponentView class]; + componentViewFactory->_componentViewClasses[componentHandle] = [componentViewFactory + _componentViewClassDescriptorFromClass:[RCTLegacyViewManagerInteropComponentView class]]; } }); return componentViewFactory; } +- (RCTComponentViewClassDescriptor)_componentViewClassDescriptorFromClass:(Class)viewClass +{ + return RCTComponentViewClassDescriptor{.viewClass = viewClass}; +} + - (void)registerComponentViewClass:(Class)componentViewClass { std::unique_lock lock(_mutex); auto componentDescriptorProvider = [componentViewClass componentDescriptorProvider]; - _componentViewClasses[componentDescriptorProvider.handle] = componentViewClass; + _componentViewClasses[componentDescriptorProvider.handle] = + [self _componentViewClassDescriptorFromClass:componentViewClass]; _providerRegistry.add(componentDescriptorProvider); auto supplementalComponentDescriptorProviders = [componentViewClass supplementalComponentDescriptorProviders]; @@ -109,9 +117,10 @@ using namespace facebook::react; @"ComponentView with componentHandle `%lli` (`%s`) not found.", componentHandle, (char *)componentHandle); - Class componentViewClass = iterator->second; + auto componentViewClassDescriptor = iterator->second; + Class viewClass = componentViewClassDescriptor.viewClass; - return RCTComponentViewDescriptor{.view = [[componentViewClass alloc] init]}; + return RCTComponentViewDescriptor{.view = [[viewClass alloc] init]}; } - (facebook::react::ComponentDescriptorRegistry::Shared)createComponentDescriptorRegistryWithParameters: