summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Guerra <fabian.guerra@mapbox.com>2018-03-28 11:08:26 -0400
committerFabian Guerra <fabian.guerra@mapbox.com>2018-03-28 19:40:09 -0400
commit79844eb330e2c21b6d6967a9d19b1eceba64bd6c (patch)
treeaa543ba1f48331ea70154e6fb799ece91c83bfa4
parent8d19aaa2abeeabec9498cf13b36e3b5e7aa9620c (diff)
downloadqtlocation-mapboxgl-79844eb330e2c21b6d6967a9d19b1eceba64bd6c.tar.gz
[ios, macos] Add mgl_coalesce conventional custom function support.
-rw-r--r--platform/darwin/src/NSExpression+MGLAdditions.mm27
-rw-r--r--platform/darwin/test/MGLExpressionTests.mm5
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);
}