Skip to content

Commit 88ac406

Browse files
nicklockwoodfacebook-github-bot-4
authored andcommitted
Replaced RegExp method parser with recursive descent
Summary: public This diff replaces the RegEx module method parser with a handwritten recursive descent parser that's faster and easier to maintain. The new parser is ~8 times faster when tested on the UIManager.managerChildren() method, and uses ~1/10 as much RAM. The new parser also supports lightweight generics, and is more tolerant of white space. (This means that you now can – and should – use types like `NSArray<NSString *> *` for your exported properties and method arguments, instead of `NSStringArray`). Reviewed By: jspahrsummers Differential Revision: D2736636 fb-gh-sync-id: f6a11431935fa8acc8ac36f3471032ec9a1c8490
1 parent ce7c0b7 commit 88ac406

20 files changed

Lines changed: 409 additions & 166 deletions

Examples/UIExplorer/UIExplorerUnitTests/RCTAllocationTests.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ - (void)testModuleMethodsAreDeallocated
132132
{
133133
__weak RCTModuleMethod *weakMethod;
134134
@autoreleasepool {
135-
__autoreleasing RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithObjCMethodName:@"test:(NSString *)a :(nonnull NSNumber *)b :(RCTResponseSenderBlock)c :(RCTResponseErrorBlock)d" JSMethodName:@"" moduleClass:[AllocationTestModule class]];
135+
__autoreleasing RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithMethodSignature:@"test:(NSString *)a :(nonnull NSNumber *)b :(RCTResponseSenderBlock)c :(RCTResponseErrorBlock)d" JSMethodName:@"" moduleClass:[AllocationTestModule class]];
136136
weakMethod = method;
137137
XCTAssertNotNil(method, @"RCTModuleMethod should have been created");
138138
}

Examples/UIExplorer/UIExplorerUnitTests/RCTMethodArgumentTests.m

Lines changed: 71 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,24 @@ @interface RCTMethodArgumentTests : XCTestCase
2323

2424
@implementation RCTMethodArgumentTests
2525

26-
extern void RCTParseObjCMethodName(NSString **objCMethodName, NSArray **argTypes);
26+
extern SEL RCTParseMethodSignature(NSString *methodSignature, NSArray **argTypes);
2727

2828
- (void)testOneArgument
2929
{
3030
NSArray *arguments;
31-
NSString *methodName = @"foo:(NSInteger)foo";
32-
RCTParseObjCMethodName(&methodName, &arguments);
33-
XCTAssertEqualObjects(methodName, @"foo:");
31+
NSString *methodSignature = @"foo:(NSInteger)foo";
32+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
33+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:");
3434
XCTAssertEqual(arguments.count, (NSUInteger)1);
3535
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSInteger");
3636
}
3737

3838
- (void)testTwoArguments
3939
{
4040
NSArray *arguments;
41-
NSString *methodName = @"foo:(NSInteger)foo bar:(BOOL)bar";
42-
RCTParseObjCMethodName(&methodName, &arguments);
43-
XCTAssertEqualObjects(methodName, @"foo:bar:");
41+
NSString *methodSignature = @"foo:(NSInteger)foo bar:(BOOL)bar";
42+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
43+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:bar:");
4444
XCTAssertEqual(arguments.count, (NSUInteger)2);
4545
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSInteger");
4646
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[1]).type, @"BOOL");
@@ -49,9 +49,9 @@ - (void)testTwoArguments
4949
- (void)testSpaces
5050
{
5151
NSArray *arguments;
52-
NSString *methodName = @"foo : (NSInteger)foo bar : (BOOL) bar";
53-
RCTParseObjCMethodName(&methodName, &arguments);
54-
XCTAssertEqualObjects(methodName, @"foo:bar:");
52+
NSString *methodSignature = @"foo : (NSInteger)foo bar : (BOOL) bar";
53+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
54+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:bar:");
5555
XCTAssertEqual(arguments.count, (NSUInteger)2);
5656
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSInteger");
5757
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[1]).type, @"BOOL");
@@ -60,9 +60,9 @@ - (void)testSpaces
6060
- (void)testNewlines
6161
{
6262
NSArray *arguments;
63-
NSString *methodName = @"foo : (NSInteger)foo\nbar : (BOOL) bar";
64-
RCTParseObjCMethodName(&methodName, &arguments);
65-
XCTAssertEqualObjects(methodName, @"foo:bar:");
63+
NSString *methodSignature = @"foo : (NSInteger)foo\nbar : (BOOL) bar";
64+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
65+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:bar:");
6666
XCTAssertEqual(arguments.count, (NSUInteger)2);
6767
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSInteger");
6868
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[1]).type, @"BOOL");
@@ -71,9 +71,9 @@ - (void)testNewlines
7171
- (void)testUnnamedArgs
7272
{
7373
NSArray *arguments;
74-
NSString *methodName = @"foo:(NSInteger)foo:(BOOL)bar";
75-
RCTParseObjCMethodName(&methodName, &arguments);
76-
XCTAssertEqualObjects(methodName, @"foo::");
74+
NSString *methodSignature = @"foo:(NSInteger)foo:(BOOL)bar";
75+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
76+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo::");
7777
XCTAssertEqual(arguments.count, (NSUInteger)2);
7878
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSInteger");
7979
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[1]).type, @"BOOL");
@@ -82,9 +82,9 @@ - (void)testUnnamedArgs
8282
- (void)testUntypedUnnamedArgs
8383
{
8484
NSArray *arguments;
85-
NSString *methodName = @"foo:foo:bar:bar";
86-
RCTParseObjCMethodName(&methodName, &arguments);
87-
XCTAssertEqualObjects(methodName, @"foo:::");
85+
NSString *methodSignature = @"foo:foo:bar:bar";
86+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
87+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:::");
8888
XCTAssertEqual(arguments.count, (NSUInteger)3);
8989
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"id");
9090
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[1]).type, @"id");
@@ -94,9 +94,9 @@ - (void)testUntypedUnnamedArgs
9494
- (void)testAttributes
9595
{
9696
NSArray *arguments;
97-
NSString *methodName = @"foo:(__attribute__((nonnull)) NSString *)foo bar:(__unused BOOL)bar";
98-
RCTParseObjCMethodName(&methodName, &arguments);
99-
XCTAssertEqualObjects(methodName, @"foo:bar:");
97+
NSString *methodSignature = @"foo:(__attribute__((unused)) NSString *)foo bar:(__unused BOOL)bar";
98+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
99+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:bar:");
100100
XCTAssertEqual(arguments.count, (NSUInteger)2);
101101
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSString");
102102
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[1]).type, @"BOOL");
@@ -105,9 +105,9 @@ - (void)testAttributes
105105
- (void)testNullability
106106
{
107107
NSArray *arguments;
108-
NSString *methodName = @"foo:(nullable NSString *)foo bar:(nonnull NSNumber *)bar baz:(id)baz";
109-
RCTParseObjCMethodName(&methodName, &arguments);
110-
XCTAssertEqualObjects(methodName, @"foo:bar:baz:");
108+
NSString *methodSignature = @"foo:(nullable NSString *)foo bar:(nonnull NSNumber *)bar baz:(id)baz";
109+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
110+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:bar:baz:");
111111
XCTAssertEqual(arguments.count, (NSUInteger)3);
112112
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSString");
113113
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[1]).type, @"NSNumber");
@@ -120,9 +120,9 @@ - (void)testNullability
120120
- (void)testSemicolonStripping
121121
{
122122
NSArray *arguments;
123-
NSString *methodName = @"foo:(NSString *)foo bar:(BOOL)bar;";
124-
RCTParseObjCMethodName(&methodName, &arguments);
125-
XCTAssertEqualObjects(methodName, @"foo:bar:");
123+
NSString *methodSignature = @"foo:(NSString *)foo bar:(BOOL)bar;";
124+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
125+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:bar:");
126126
XCTAssertEqual(arguments.count, (NSUInteger)2);
127127
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSString");
128128
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[1]).type, @"BOOL");
@@ -131,14 +131,54 @@ - (void)testSemicolonStripping
131131
- (void)testUnused
132132
{
133133
NSArray *arguments;
134-
NSString *methodName = @"foo:(__unused NSString *)foo bar:(NSNumber *)bar";
135-
RCTParseObjCMethodName(&methodName, &arguments);
136-
XCTAssertEqualObjects(methodName, @"foo:bar:");
134+
NSString *methodSignature = @"foo:(__unused NSString *)foo bar:(NSNumber *)bar";
135+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
136+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:bar:");
137137
XCTAssertEqual(arguments.count, (NSUInteger)2);
138138
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSString");
139139
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[1]).type, @"NSNumber");
140140
XCTAssertTrue(((RCTMethodArgument *)arguments[0]).unused);
141141
XCTAssertFalse(((RCTMethodArgument *)arguments[1]).unused);
142142
}
143143

144+
- (void)testGenericArray
145+
{
146+
NSArray *arguments;
147+
NSString *methodSignature = @"foo:(NSArray<NSString *> *)foo;";
148+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
149+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:");
150+
XCTAssertEqual(arguments.count, (NSUInteger)1);
151+
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSStringArray");
152+
}
153+
154+
- (void)testNestedGenericArray
155+
{
156+
NSArray *arguments;
157+
NSString *methodSignature = @"foo:(NSArray<NSArray<NSString *> *> *)foo;";
158+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
159+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:");
160+
XCTAssertEqual(arguments.count, (NSUInteger)1);
161+
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSStringArrayArray");
162+
}
163+
164+
- (void)testGenericSet
165+
{
166+
NSArray *arguments;
167+
NSString *methodSignature = @"foo:(NSSet<NSNumber *> *)foo;";
168+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
169+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:");
170+
XCTAssertEqual(arguments.count, (NSUInteger)1);
171+
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSNumberSet");
172+
}
173+
174+
- (void)testGenericDictionary
175+
{
176+
NSArray *arguments;
177+
NSString *methodSignature = @"foo:(NSDictionary<NSString *, NSNumber *> *)foo;";
178+
SEL selector = RCTParseMethodSignature(methodSignature, &arguments);
179+
XCTAssertEqualObjects(NSStringFromSelector(selector), @"foo:");
180+
XCTAssertEqual(arguments.count, (NSUInteger)1);
181+
XCTAssertEqualObjects(((RCTMethodArgument *)arguments[0]).type, @"NSNumberDictionary");
182+
}
183+
144184
@end

Examples/UIExplorer/UIExplorerUnitTests/RCTModuleMethodTests.m

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ - (void)doFooWithBar:(__unused NSString *)bar { }
4747

4848
- (void)testNonnull
4949
{
50-
NSString *methodName = @"doFooWithBar:(nonnull NSString *)bar";
51-
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithObjCMethodName:methodName
52-
JSMethodName:nil
53-
moduleClass:[self class]];
50+
NSString *methodSignature = @"doFooWithBar:(nonnull NSString *)bar";
51+
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithMethodSignature:methodSignature
52+
JSMethodName:nil
53+
moduleClass:[self class]];
5454
XCTAssertFalse(RCTLogsError(^{
5555
[method invokeWithBridge:nil module:self arguments:@[@"Hello World"]];
5656
}));
@@ -72,40 +72,40 @@ - (void)testNumbersNonnull
7272
{
7373
// Specifying an NSNumber param without nonnull isn't allowed
7474
XCTAssertTrue(RCTLogsError(^{
75-
NSString *methodName = @"doFooWithNumber:(NSNumber *)n";
76-
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithObjCMethodName:methodName
77-
JSMethodName:nil
78-
moduleClass:[self class]];
75+
NSString *methodSignature = @"doFooWithNumber:(NSNumber *)n";
76+
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithMethodSignature:methodSignature
77+
JSMethodName:nil
78+
moduleClass:[self class]];
7979
// Invoke method to trigger parsing
8080
[method invokeWithBridge:nil module:self arguments:@[@1]];
8181
}));
8282
}
8383

8484
{
85-
NSString *methodName = @"doFooWithNumber:(nonnull NSNumber *)n";
86-
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithObjCMethodName:methodName
87-
JSMethodName:nil
88-
moduleClass:[self class]];
85+
NSString *methodSignature = @"doFooWithNumber:(nonnull NSNumber *)n";
86+
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithMethodSignature:methodSignature
87+
JSMethodName:nil
88+
moduleClass:[self class]];
8989
XCTAssertTrue(RCTLogsError(^{
9090
[method invokeWithBridge:nil module:self arguments:@[[NSNull null]]];
9191
}));
9292
}
9393

9494
{
95-
NSString *methodName = @"doFooWithDouble:(double)n";
96-
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithObjCMethodName:methodName
97-
JSMethodName:nil
98-
moduleClass:[self class]];
95+
NSString *methodSignature = @"doFooWithDouble:(double)n";
96+
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithMethodSignature:methodSignature
97+
JSMethodName:nil
98+
moduleClass:[self class]];
9999
XCTAssertTrue(RCTLogsError(^{
100100
[method invokeWithBridge:nil module:self arguments:@[[NSNull null]]];
101101
}));
102102
}
103103

104104
{
105-
NSString *methodName = @"doFooWithInteger:(NSInteger)n";
106-
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithObjCMethodName:methodName
107-
JSMethodName:nil
108-
moduleClass:[self class]];
105+
NSString *methodSignature = @"doFooWithInteger:(NSInteger)n";
106+
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithMethodSignature:methodSignature
107+
JSMethodName:nil
108+
moduleClass:[self class]];
109109
XCTAssertTrue(RCTLogsError(^{
110110
[method invokeWithBridge:nil module:self arguments:@[[NSNull null]]];
111111
}));
@@ -114,10 +114,10 @@ - (void)testNumbersNonnull
114114

115115
- (void)testStructArgument
116116
{
117-
NSString *methodName = @"doFooWithCGRect:(CGRect)s";
118-
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithObjCMethodName:methodName
119-
JSMethodName:nil
120-
moduleClass:[self class]];
117+
NSString *methodSignature = @"doFooWithCGRect:(CGRect)s";
118+
RCTModuleMethod *method = [[RCTModuleMethod alloc] initWithMethodSignature:methodSignature
119+
JSMethodName:nil
120+
moduleClass:[self class]];
121121

122122
CGRect r = CGRectMake(10, 20, 30, 40);
123123
[method invokeWithBridge:nil module:self arguments:@[@[@10, @20, @30, @40]]];
@@ -126,13 +126,13 @@ - (void)testStructArgument
126126

127127
- (void)testWhitespaceTolerance
128128
{
129-
NSString *methodName = @"doFoo : \t (NSString *)foo";
129+
NSString *methodSignature = @"doFoo : \t (NSString *)foo";
130130

131131
__block RCTModuleMethod *method;
132132
XCTAssertFalse(RCTLogsError(^{
133-
method = [[RCTModuleMethod alloc] initWithObjCMethodName:methodName
134-
JSMethodName:nil
135-
moduleClass:[self class]];
133+
method = [[RCTModuleMethod alloc] initWithMethodSignature:methodSignature
134+
JSMethodName:nil
135+
moduleClass:[self class]];
136136
}));
137137

138138
XCTAssertEqualObjects(method.JSMethodName, @"doFoo");

Libraries/Network/RCTNetworking.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ @implementation RCTHTTPFormDataHelper
5656
return [[NSString alloc] initWithBytesNoCopy:bytes length:boundaryLength encoding:NSUTF8StringEncoding freeWhenDone:YES];
5757
}
5858

59-
- (RCTURLRequestCancellationBlock)process:(NSDictionaryArray *)formData
59+
- (RCTURLRequestCancellationBlock)process:(NSArray<NSDictionary *> *)formData
6060
callback:(RCTHTTPQueryResult)callback
6161
{
6262
RCTAssertThread(_networker.methodQueue, @"process: must be called on method queue");
@@ -289,7 +289,7 @@ - (RCTURLRequestCancellationBlock)processDataForHTTPQuery:(nullable NSDictionary
289289
}
290290
};
291291
}
292-
NSDictionaryArray *formData = [RCTConvert NSDictionaryArray:query[@"formData"]];
292+
NSArray<NSDictionary *> *formData = [RCTConvert NSDictionaryArray:query[@"formData"]];
293293
if (formData) {
294294
RCTHTTPFormDataHelper *formDataHelper = [RCTHTTPFormDataHelper new];
295295
formDataHelper.networker = self;

Libraries/Settings/RCTSettingsManager.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ - (void)userDefaultsDidChange:(NSNotification *)note
9090
/**
9191
* Remove some values from the settings.
9292
*/
93-
RCT_EXPORT_METHOD(deleteValues:(NSStringArray *)keys)
93+
RCT_EXPORT_METHOD(deleteValues:(NSArray<NSString *> *)keys)
9494
{
9595
_ignoringUpdates = YES;
9696
for (NSString *key in keys) {

React/Base/RCTConvert.h

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -94,28 +94,13 @@ typedef NSURL RCTFileURL;
9494
size:(id)size weight:(id)weight style:(id)style
9595
scaleMultiplier:(CGFloat)scaleMultiplier;
9696

97-
typedef NSArray NSArrayArray;
9897
+ (NSArray<NSArray *> *)NSArrayArray:(id)json;
99-
100-
typedef NSArray NSStringArray;
10198
+ (NSArray<NSString *> *)NSStringArray:(id)json;
102-
103-
typedef NSArray NSStringArrayArray;
10499
+ (NSArray<NSArray<NSString *> *> *)NSStringArrayArray:(id)json;
105-
106-
typedef NSArray NSDictionaryArray;
107100
+ (NSArray<NSDictionary *> *)NSDictionaryArray:(id)json;
108-
109-
typedef NSArray NSURLArray;
110101
+ (NSArray<NSURL *> *)NSURLArray:(id)json;
111-
112-
typedef NSArray RCTFileURLArray;
113-
+ (NSArray<NSURL *> *)RCTFileURLArray:(id)json;
114-
115-
typedef NSArray NSNumberArray;
102+
+ (NSArray<RCTFileURL *> *)RCTFileURLArray:(id)json;
116103
+ (NSArray<NSNumber *> *)NSNumberArray:(id)json;
117-
118-
typedef NSArray UIColorArray;
119104
+ (NSArray<UIColor *> *)UIColorArray:(id)json;
120105

121106
typedef NSArray CGColorArray;
@@ -145,6 +130,18 @@ typedef BOOL css_clip_t, css_backface_visibility_t;
145130

146131
@interface RCTConvert (Deprecated)
147132

133+
/**
134+
* Use lightweight generics syntax instead, e.g. NSArray<NSString *>
135+
*/
136+
typedef NSArray NSArrayArray __deprecated_msg("Use NSArray<NSArray *>");
137+
typedef NSArray NSStringArray __deprecated_msg("Use NSArray<NSString *>");
138+
typedef NSArray NSStringArrayArray __deprecated_msg("Use NSArray<NSArray<NSString *> *>");
139+
typedef NSArray NSDictionaryArray __deprecated_msg("Use NSArray<NSDictionary *>");
140+
typedef NSArray NSURLArray __deprecated_msg("Use NSArray<NSURL *>");
141+
typedef NSArray RCTFileURLArray __deprecated_msg("Use NSArray<RCTFileURL *>");
142+
typedef NSArray NSNumberArray __deprecated_msg("Use NSArray<NSNumber *>");
143+
typedef NSArray UIColorArray __deprecated_msg("Use NSArray<UIColor *>");
144+
148145
/**
149146
* Synchronous image loading is generally a bad idea for performance reasons.
150147
* If you need to pass image references, try to use `RCTImageSource` and then
@@ -162,6 +159,11 @@ RCT_EXTERN NSNumber *RCTConvertEnumValue(const char *, NSDictionary *, NSNumber
162159
RCT_EXTERN NSNumber *RCTConvertMultiEnumValue(const char *, NSDictionary *, NSNumber *, id);
163160
RCT_EXTERN NSArray *RCTConvertArrayValue(SEL, id);
164161

162+
/**
163+
* Get the converter function for the specified type
164+
*/
165+
RCT_EXTERN SEL RCTConvertSelectorForType(NSString *type);
166+
165167
/**
166168
* This macro is used for logging conversion errors. This is just used to
167169
* avoid repeating the same boilerplate for every error message.
@@ -238,7 +240,7 @@ RCT_CUSTOM_CONVERTER(type, type, [RCT_DEBUG ? [self NSNumber:json] : json getter
238240
* This macro is used for creating converter functions for typed arrays.
239241
*/
240242
#define RCT_ARRAY_CONVERTER(type) \
241-
+ (NSArray<type *> *)type##Array:(id)json \
243+
+ (NSArray<id> *)type##Array:(id)json \
242244
{ \
243245
return RCTConvertArrayValue(@selector(type:), json); \
244246
}

0 commit comments

Comments
 (0)