diff options
author | Fabian Guerra <fabian.guerra@mapbox.com> | 2018-03-28 11:08:26 -0400 |
---|---|---|
committer | Fabian Guerra <fabian.guerra@mapbox.com> | 2018-03-28 19:40:09 -0400 |
commit | 79844eb330e2c21b6d6967a9d19b1eceba64bd6c (patch) | |
tree | aa543ba1f48331ea70154e6fb799ece91c83bfa4 | |
parent | 8d19aaa2abeeabec9498cf13b36e3b5e7aa9620c (diff) | |
download | qtlocation-mapboxgl-79844eb330e2c21b6d6967a9d19b1eceba64bd6c.tar.gz |
[ios, macos] Add mgl_coalesce conventional custom function support.
-rw-r--r-- | platform/darwin/src/NSExpression+MGLAdditions.mm | 27 | ||||
-rw-r--r-- | platform/darwin/test/MGLExpressionTests.mm | 5 |
2 files changed, 25 insertions, 7 deletions
diff --git a/platform/darwin/src/NSExpression+MGLAdditions.mm b/platform/darwin/src/NSExpression+MGLAdditions.mm index 2af636516e..4f5739aaa1 100644 --- a/platform/darwin/src/NSExpression+MGLAdditions.mm +++ b/platform/darwin/src/NSExpression+MGLAdditions.mm @@ -409,6 +409,12 @@ return [self valueForKeyPath:@"mgl_jsonExpressionObject"]; } +- (id)mgl_coalesce { + [NSException raise:NSInvalidArgumentException + format:@"Coalesce expressions lack underlying Objective-C implementations."]; + return nil; +} + @end @implementation NSDictionary (MGLExpressionAdditions) @@ -861,14 +867,10 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) { } else if ([function isEqualToString:@"MGL_MATCH"] || [function isEqualToString:@"mgl_match:"]) { return self.mgl_jsonMatchExpressionObject; - } else if ([function isEqualToString:@"mgl_coalesce:"]) { - NSMutableArray *expressionObject = [NSMutableArray arrayWithObjects:@"coalesce", nil]; + } else if ([function isEqualToString:@"mgl_coalesce:"] || + [function isEqualToString:@"mgl_coalesce"]) { - for (NSExpression *expression in self.arguments.firstObject.constantValue) { - [expressionObject addObject:[expression mgl_jsonExpressionObject]]; - } - - return expressionObject; + return self.mgl_jsonCoalesceExpressionObject; } else if ([function isEqualToString:@"castObject:toType:"]) { id object = self.arguments.firstObject.mgl_jsonExpressionObject; NSString *type = self.arguments[1].mgl_jsonExpressionObject; @@ -1053,4 +1055,15 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) { return expressionObject; } +- (id)mgl_jsonCoalesceExpressionObject { + BOOL isAftermarketFunction = [self.function isEqualToString:@"mgl_coalesce:"]; + NSMutableArray *expressionObject = [NSMutableArray arrayWithObjects:@"coalesce", nil]; + + for (NSExpression *expression in (isAftermarketFunction ? self.arguments.firstObject : self.operand).constantValue) { + [expressionObject addObject:[expression mgl_jsonExpressionObject]]; + } + + return expressionObject; +} + @end diff --git a/platform/darwin/test/MGLExpressionTests.mm b/platform/darwin/test/MGLExpressionTests.mm index 17c48af226..20209f305e 100644 --- a/platform/darwin/test/MGLExpressionTests.mm +++ b/platform/darwin/test/MGLExpressionTests.mm @@ -658,8 +658,13 @@ using namespace std::string_literals; [NSExpression expressionForKeyPath:@"y"], [NSExpression expressionForKeyPath:@"z"], [NSExpression expressionForConstantValue:@0]]]; + NSExpression *compatibilityExpression = [NSExpression expressionWithFormat:@"FUNCTION(%@, 'mgl_coalesce')", @[[NSExpression expressionForKeyPath:@"x"], + [NSExpression expressionForKeyPath:@"y"], + [NSExpression expressionForKeyPath:@"z"], + [NSExpression expressionForConstantValue:@0]]]; NSArray *jsonExpression = @[@"coalesce", @[@"get", @"x"], @[@"get", @"y"], @[@"get", @"z"], @0]; XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression); + XCTAssertEqualObjects(compatibilityExpression.mgl_jsonExpressionObject, jsonExpression); XCTAssertEqualObjects([NSExpression mgl_expressionWithJSONObject:jsonExpression], expression); } |