Split and fix FBCxxUtils
Summary: This target was bloating. Split it in two. Migrate to autotests. Reviewed By: joshleibsly Differential Revision: D16829348 fbshipit-source-id: 17f2a10371293ddb850c4556abeecee99a9d7bef
This commit is contained in:
committed by
Facebook Github Bot
parent
03d4a7d750
commit
2b050851a3
@@ -43,14 +43,14 @@ Pod::Spec.new do |spec|
|
||||
"HEADER_SEARCH_PATHS" => header_search_paths }
|
||||
end
|
||||
|
||||
spec.subspec 'FBCxxUtils' do |ss|
|
||||
ss.header_dir = 'FBCxxUtils'
|
||||
spec.subspec 'FBCxxFollyDynamicConvert' do |ss|
|
||||
ss.header_dir = 'FBCxxFollyDynamicConvert'
|
||||
ss.compiler_flags = folly_compiler_flags
|
||||
ss.dependency 'Flipper-Folly', '~> 2.0'
|
||||
ss.source_files = 'iOS/FlipperKit/FBCxxUtils/**/*.{h,mm}'
|
||||
ss.source_files = 'iOS/FlipperKit/FBCxxFollyDynamicConvert/**/*.{h,mm}'
|
||||
# We set these files as private headers since they only need to be accessed
|
||||
# by other FlipperKit source files
|
||||
ss.private_header_files = 'iOS/FlipperKit/FBCxxUtils/**/*.h'
|
||||
ss.private_header_files = 'iOS/FlipperKit/FBCxxFollyDynamicConvert/**/*.h'
|
||||
header_search_paths = "\"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/DoubleConversion\""
|
||||
ss.pod_target_xcconfig = { "USE_HEADERMAP" => "NO",
|
||||
"ONLY_ACTIVE_ARCH": "YES",
|
||||
@@ -69,7 +69,7 @@ Pod::Spec.new do |spec|
|
||||
|
||||
spec.subspec "Core" do |ss|
|
||||
ss.dependency 'FlipperKit/FBDefines'
|
||||
ss.dependency 'FlipperKit/FBCxxUtils'
|
||||
ss.dependency 'FlipperKit/FBCxxFollyDynamicConvert'
|
||||
ss.dependency 'FlipperKit/CppBridge'
|
||||
ss.dependency 'FlipperKit/FKPortForwarding'
|
||||
ss.dependency 'Flipper', '~>'+flipperkit_version
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
53915C9D2152E3030090EEA6 /* FlipperPlugin.h */,
|
||||
53915C9E2152E3030090EEA6 /* FlipperUtil.m */,
|
||||
53915C9F2152E3030090EEA6 /* Utilities */,
|
||||
53915CA42152E3040090EEA6 /* FBCxxUtils */,
|
||||
53915CA42152E3040090EEA6 /* FBCxxFollyDynamicConvert */,
|
||||
53915CA72152E3040090EEA6 /* FlipperStateUpdateListener.h */,
|
||||
53915CA82152E3040090EEA6 /* CppBridge */,
|
||||
53915CAE2152E3040090EEA6 /* SKMacros.h */,
|
||||
@@ -138,13 +138,13 @@
|
||||
path = PortForwarding;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
53915CA42152E3040090EEA6 /* FBCxxUtils */ = {
|
||||
53915CA42152E3040090EEA6 /* FBCxxFollyDynamicConvert */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
53915CA52152E3040090EEA6 /* FBCxxFollyDynamicConvert.mm */,
|
||||
53915CA62152E3040090EEA6 /* FBCxxFollyDynamicConvert.h */,
|
||||
);
|
||||
path = FBCxxUtils;
|
||||
path = FBCxxFollyDynamicConvert;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
53915CA82152E3040090EEA6 /* CppBridge */ = {
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
*/
|
||||
#import "FlipperCppBridgingConnection.h"
|
||||
|
||||
#import <FBCxxUtils/FBCxxFollyDynamicConvert.h>
|
||||
#import <FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.h>
|
||||
|
||||
#import "FlipperCppBridgingResponder.h"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
*/
|
||||
#import "FlipperCppBridgingResponder.h"
|
||||
|
||||
#import <FBCxxUtils/FBCxxFollyDynamicConvert.h>
|
||||
#import <FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.h>
|
||||
|
||||
@implementation FlipperCppBridgingResponder {
|
||||
std::shared_ptr<facebook::flipper::FlipperResponder> responder_;
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
../../../../../fbobjc/Libraries/FBCxxUtils/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.h
|
||||
@@ -0,0 +1 @@
|
||||
../../../../../fbobjc/Libraries/FBCxxUtils/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.mm
|
||||
@@ -1,14 +0,0 @@
|
||||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
#pragma once
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#include <folly/dynamic.h>
|
||||
|
||||
namespace facebook {
|
||||
namespace cxxutils {
|
||||
|
||||
folly::dynamic convertIdToFollyDynamic(id json, bool nullifyNanAndInf = false);
|
||||
id convertFollyDynamicToId(const folly::dynamic &dyn);
|
||||
|
||||
} }
|
||||
@@ -1,128 +0,0 @@
|
||||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
|
||||
#import "FBCxxFollyDynamicConvert.h"
|
||||
|
||||
#import <objc/runtime.h>
|
||||
|
||||
namespace facebook {
|
||||
namespace cxxutils {
|
||||
|
||||
/*
|
||||
* The implementation is taken from RCTFollyConvert(https://fburl.com/vzw8ql2q)
|
||||
*/
|
||||
|
||||
id convertFollyDynamicToId(const folly::dynamic &dyn)
|
||||
{
|
||||
// I could imagine an implementation which avoids copies by wrapping the
|
||||
// dynamic in a derived class of NSDictionary. We can do that if profiling
|
||||
// implies it will help.
|
||||
|
||||
switch (dyn.type()) {
|
||||
case folly::dynamic::NULLT:
|
||||
return (id)kCFNull;
|
||||
case folly::dynamic::BOOL:
|
||||
return dyn.getBool() ? @YES : @NO;
|
||||
case folly::dynamic::INT64:
|
||||
return @(dyn.getInt());
|
||||
case folly::dynamic::DOUBLE:
|
||||
return @(dyn.getDouble());
|
||||
case folly::dynamic::STRING:
|
||||
return [[NSString alloc] initWithBytes:dyn.c_str() length:dyn.size() encoding:NSUTF8StringEncoding];
|
||||
case folly::dynamic::ARRAY: {
|
||||
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:dyn.size()];
|
||||
for (auto &elem : dyn) {
|
||||
id obj = convertFollyDynamicToId(elem);
|
||||
if (obj) {
|
||||
[array addObject:obj];
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
case folly::dynamic::OBJECT: {
|
||||
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:dyn.size()];
|
||||
for (auto &elem : dyn.items()) {
|
||||
id obj = convertFollyDynamicToId(elem.second);
|
||||
if (obj) {
|
||||
dict[convertFollyDynamicToId(elem.first)] = obj;
|
||||
}
|
||||
}
|
||||
return dict;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
folly::dynamic convertIdToFollyDynamic(id json, bool nullifyNanAndInf)
|
||||
{
|
||||
if (json == nil || json == (id)kCFNull) {
|
||||
return nullptr;
|
||||
} else if ([json isKindOfClass:[NSNumber class]]) {
|
||||
const char *objCType = [json objCType];
|
||||
switch (objCType[0]) {
|
||||
// This is a c++ bool or C99 _Bool. On some platforms, BOOL is a bool.
|
||||
case _C_BOOL:
|
||||
return (bool)[json boolValue];
|
||||
case _C_CHR:
|
||||
// On some platforms, objc BOOL is a signed char, but it
|
||||
// might also be a small number. Use the same hack JSC uses
|
||||
// to distinguish them:
|
||||
// https://phabricator.intern.facebook.com/diffusion/FBS/browse/master/fbobjc/xplat/third-party/jsc/safari-600-1-4-17/JavaScriptCore/API/JSValue.mm;b8ee03916489f8b12143cd5c0bca546da5014fc9$901
|
||||
if ([json isKindOfClass:[@YES class]]) {
|
||||
return (bool)[json boolValue];
|
||||
} else {
|
||||
const auto value = [json longLongValue];
|
||||
if (nullifyNanAndInf && (isnan(value) || isinf(value))) {
|
||||
return nullptr;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
case _C_UCHR:
|
||||
case _C_SHT:
|
||||
case _C_USHT:
|
||||
case _C_INT:
|
||||
case _C_UINT:
|
||||
case _C_LNG:
|
||||
case _C_ULNG:
|
||||
case _C_LNG_LNG:
|
||||
case _C_ULNG_LNG: {
|
||||
const auto value = [json longLongValue];
|
||||
if (nullifyNanAndInf && (isnan(value) || isinf(value))) {
|
||||
return nullptr;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
case _C_FLT:
|
||||
case _C_DBL: {
|
||||
const auto value = [json doubleValue];
|
||||
if (nullifyNanAndInf && (isnan(value) || isinf(value))) {
|
||||
return nullptr;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
// default:
|
||||
// fall through
|
||||
}
|
||||
} else if ([json isKindOfClass:[NSString class]]) {
|
||||
NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding];
|
||||
return std::string(reinterpret_cast<const char *>(data.bytes), data.length);
|
||||
} else if ([json isKindOfClass:[NSArray class]]) {
|
||||
folly::dynamic array = folly::dynamic::array;
|
||||
for (id element in json) {
|
||||
array.push_back(convertIdToFollyDynamic(element, nullifyNanAndInf));
|
||||
}
|
||||
return array;
|
||||
} else if ([json isKindOfClass:[NSDictionary class]]) {
|
||||
__block folly::dynamic object = folly::dynamic::object();
|
||||
|
||||
[json enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, __unused BOOL *stop) {
|
||||
object.insert(convertIdToFollyDynamic(key, nullifyNanAndInf), convertIdToFollyDynamic(value, nullifyNanAndInf));
|
||||
}];
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
#pragma once
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
namespace facebook {
|
||||
namespace cxxutils {
|
||||
using json = nlohmann::json;
|
||||
NSDictionary<NSString *, id> *convertNlohmannJSONToNSDictionary(const json &input);
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
|
||||
#import "FBCxxNlohmannJSONConvert.h"
|
||||
|
||||
#import <objc/runtime.h>
|
||||
|
||||
namespace facebook {
|
||||
namespace cxxutils {
|
||||
using json = nlohmann::json;
|
||||
|
||||
id convertJSONValue(const json &input);
|
||||
NSString *convertToNSString(const std::string &input);
|
||||
|
||||
id convertJSONValue(const json &input)
|
||||
|
||||
{
|
||||
// for reference see
|
||||
// [github](https://github.com/nlohmann/json/blob/8d6c033f80461123cbfba5e7a3027a9c35ea2eef/include/nlohmann/detail/value_t.hpp#L41)
|
||||
using value_t = json::value_t;
|
||||
|
||||
switch (input.type()) {
|
||||
case value_t::string: {
|
||||
return convertToNSString(input.get<std::string>());
|
||||
}
|
||||
case value_t::object:
|
||||
return convertNlohmannJSONToNSDictionary(input);
|
||||
case value_t::array: {
|
||||
NSMutableArray<id> *array = [[NSMutableArray alloc] initWithCapacity:input.size()];
|
||||
for (auto &elem : input) {
|
||||
id obj = convertJSONValue(elem);
|
||||
if (obj) {
|
||||
[array addObject:obj];
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
case value_t::boolean:
|
||||
return input.get<bool>() ? @YES : @NO;
|
||||
case value_t::number_integer:
|
||||
return @(input.get<int>());
|
||||
case value_t::number_unsigned:
|
||||
return @(input.get<uint>());
|
||||
case value_t::number_float:
|
||||
return @(input.get<float>());
|
||||
case value_t::null:
|
||||
case value_t::discarded:
|
||||
return [NSNull null];
|
||||
}
|
||||
}
|
||||
|
||||
NSString *convertToNSString(const std::string &str)
|
||||
{
|
||||
return [[NSString alloc] initWithBytes:str.c_str() length:str.size() encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
NSDictionary<NSString *, id> *convertNlohmannJSONToNSDictionary(const json &input)
|
||||
{
|
||||
NSMutableDictionary<NSString *, id> *result = [NSMutableDictionary new];
|
||||
|
||||
for (auto &el : input.items()) {
|
||||
const auto key = convertToNSString(el.key());
|
||||
id value = convertJSONValue(el.value());
|
||||
if (value) {
|
||||
result[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
return [result copy];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user