diff --git a/FlipperKit.podspec b/FlipperKit.podspec index 29323443a..a46e65d16 100644 --- a/FlipperKit.podspec +++ b/FlipperKit.podspec @@ -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 diff --git a/iOS/FlipperKit.xcodeproj/project.pbxproj b/iOS/FlipperKit.xcodeproj/project.pbxproj index 1a03df5b2..0747da8a5 100644 --- a/iOS/FlipperKit.xcodeproj/project.pbxproj +++ b/iOS/FlipperKit.xcodeproj/project.pbxproj @@ -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 = ""; }; - 53915CA42152E3040090EEA6 /* FBCxxUtils */ = { + 53915CA42152E3040090EEA6 /* FBCxxFollyDynamicConvert */ = { isa = PBXGroup; children = ( 53915CA52152E3040090EEA6 /* FBCxxFollyDynamicConvert.mm */, 53915CA62152E3040090EEA6 /* FBCxxFollyDynamicConvert.h */, ); - path = FBCxxUtils; + path = FBCxxFollyDynamicConvert; sourceTree = ""; }; 53915CA82152E3040090EEA6 /* CppBridge */ = { diff --git a/iOS/FlipperKit/CppBridge/FlipperCppBridgingConnection.mm b/iOS/FlipperKit/CppBridge/FlipperCppBridgingConnection.mm index 75c20543f..93cfeff85 100644 --- a/iOS/FlipperKit/CppBridge/FlipperCppBridgingConnection.mm +++ b/iOS/FlipperKit/CppBridge/FlipperCppBridgingConnection.mm @@ -7,7 +7,7 @@ */ #import "FlipperCppBridgingConnection.h" -#import +#import #import "FlipperCppBridgingResponder.h" diff --git a/iOS/FlipperKit/CppBridge/FlipperCppBridgingResponder.mm b/iOS/FlipperKit/CppBridge/FlipperCppBridgingResponder.mm index bfed7510a..db074e775 100644 --- a/iOS/FlipperKit/CppBridge/FlipperCppBridgingResponder.mm +++ b/iOS/FlipperKit/CppBridge/FlipperCppBridgingResponder.mm @@ -7,7 +7,7 @@ */ #import "FlipperCppBridgingResponder.h" -#import +#import @implementation FlipperCppBridgingResponder { std::shared_ptr responder_; diff --git a/iOS/FlipperKit/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.h b/iOS/FlipperKit/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.h new file mode 120000 index 000000000..b72ae285b --- /dev/null +++ b/iOS/FlipperKit/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.h @@ -0,0 +1 @@ +../../../../../fbobjc/Libraries/FBCxxUtils/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.h \ No newline at end of file diff --git a/iOS/FlipperKit/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.mm b/iOS/FlipperKit/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.mm new file mode 120000 index 000000000..312d7d415 --- /dev/null +++ b/iOS/FlipperKit/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.mm @@ -0,0 +1 @@ +../../../../../fbobjc/Libraries/FBCxxUtils/FBCxxFollyDynamicConvert/FBCxxFollyDynamicConvert.mm \ No newline at end of file diff --git a/iOS/FlipperKit/FBCxxUtils/FBCxxFollyDynamicConvert.h b/iOS/FlipperKit/FBCxxUtils/FBCxxFollyDynamicConvert.h deleted file mode 100644 index dbd834633..000000000 --- a/iOS/FlipperKit/FBCxxUtils/FBCxxFollyDynamicConvert.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2004-present Facebook. All Rights Reserved. -#pragma once - -#import - -#include - -namespace facebook { -namespace cxxutils { - -folly::dynamic convertIdToFollyDynamic(id json, bool nullifyNanAndInf = false); -id convertFollyDynamicToId(const folly::dynamic &dyn); - -} } diff --git a/iOS/FlipperKit/FBCxxUtils/FBCxxFollyDynamicConvert.mm b/iOS/FlipperKit/FBCxxUtils/FBCxxFollyDynamicConvert.mm deleted file mode 100644 index 77f50c474..000000000 --- a/iOS/FlipperKit/FBCxxUtils/FBCxxFollyDynamicConvert.mm +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2004-present Facebook. All Rights Reserved. - -#import "FBCxxFollyDynamicConvert.h" - -#import - -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(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; -} -} -} diff --git a/iOS/FlipperKit/FBCxxUtils/FBCxxNlohmannJSONConvert.h b/iOS/FlipperKit/FBCxxUtils/FBCxxNlohmannJSONConvert.h deleted file mode 100644 index 234f686c1..000000000 --- a/iOS/FlipperKit/FBCxxUtils/FBCxxNlohmannJSONConvert.h +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2004-present Facebook. All Rights Reserved. -#pragma once - -#import - -#include - -namespace facebook { -namespace cxxutils { -using json = nlohmann::json; -NSDictionary *convertNlohmannJSONToNSDictionary(const json &input); -} -} diff --git a/iOS/FlipperKit/FBCxxUtils/FBCxxNlohmannJSONConvert.mm b/iOS/FlipperKit/FBCxxUtils/FBCxxNlohmannJSONConvert.mm deleted file mode 100644 index 9a9cdf852..000000000 --- a/iOS/FlipperKit/FBCxxUtils/FBCxxNlohmannJSONConvert.mm +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2004-present Facebook. All Rights Reserved. - -#import "FBCxxNlohmannJSONConvert.h" - -#import - -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()); - } - case value_t::object: - return convertNlohmannJSONToNSDictionary(input); - case value_t::array: { - NSMutableArray *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() ? @YES : @NO; - case value_t::number_integer: - return @(input.get()); - case value_t::number_unsigned: - return @(input.get()); - case value_t::number_float: - return @(input.get()); - 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 *convertNlohmannJSONToNSDictionary(const json &input) -{ - NSMutableDictionary *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]; -} -} -}