summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Guerra <fabian.guerra@mapbox.com>2018-03-28 14:40:28 -0400
committerFabian Guerra <fabian.guerra@mapbox.com>2018-03-28 14:40:28 -0400
commitae3df5c67698be0f0e7b39367640115d917477fc (patch)
treedf7141ddaeaad50815dff96e49fea70956d9db69
parent8d13a109e6eb6d2cd556c9a4806ef5b89c313ecc (diff)
downloadqtlocation-mapboxgl-upstream/fabian-feature-lookup-11006.tar.gz
[ios, macos] Refactor expressions variable name and 'mgl_has' implementation.upstream/fabian-feature-lookup-11006
-rw-r--r--platform/darwin/src/NSExpression+MGLAdditions.mm38
-rw-r--r--platform/darwin/src/NSExpression+MGLPrivateAdditions.h4
-rw-r--r--platform/darwin/test/MGLExpressionTests.mm24
3 files changed, 46 insertions, 20 deletions
diff --git a/platform/darwin/src/NSExpression+MGLAdditions.mm b/platform/darwin/src/NSExpression+MGLAdditions.mm
index 2b42fb6e78..f10f500755 100644
--- a/platform/darwin/src/NSExpression+MGLAdditions.mm
+++ b/platform/darwin/src/NSExpression+MGLAdditions.mm
@@ -277,6 +277,12 @@
return expressionObject;
}
+- (id)mgl_has:(id)element {
+ [NSException raise:NSInvalidArgumentException
+ format:@"Has expressions lack underlying Objective-C implementations."];
+ return nil;
+}
+
@end
@implementation NSExpression (MGLExpressionAdditions)
@@ -287,6 +293,12 @@
return self;
}
+- (id)mgl_has:(id)element {
+ [NSException raise:NSInvalidArgumentException
+ format:@"Has expressions lack underlying Objective-C implementations."];
+ return nil;
+}
+
@end
@implementation NSExpression (MGLAdditions)
@@ -410,11 +422,12 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
NSArray *subexpressions = MGLSubexpressionsWithJSONObjects(argumentObjects);
NSExpression *index = subexpressions.firstObject;
NSExpression *operand = subexpressions[1];
- return [NSExpression expressionForFunction:operand selectorName:@"objectAtIndex:" arguments:@[index]];
+ return [NSExpression expressionForFunction:@"objectFrom:withIndex:" arguments:@[operand, index]];
} else if ([op isEqualToString:@"has"]) {
NSArray *subexpressions = MGLSubexpressionsWithJSONObjects(argumentObjects);
+ NSExpression *operand = argumentObjects.count > 1 ? subexpressions[1] : [NSExpression expressionWithFormat:@"self"];
NSExpression *property = subexpressions.firstObject;
- return [NSExpression expressionWithFormat:@"FUNCTION(%@, 'has')", property];
+ return [NSExpression expressionWithFormat:@"FUNCTION(%@, 'mgl_has:', %@)", operand, property];
} else if ([op isEqualToString:@"interpolate"]) {
NSArray *interpolationOptions = argumentObjects.firstObject;
NSString *curveType = interpolationOptions.firstObject;
@@ -466,9 +479,9 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
} else if ([op isEqualToString:@"heatmap-density"]) {
return [NSExpression expressionForVariable:@"heatmapDensity"];
} else if ([op isEqualToString:@"geometry-type"]) {
- return [NSExpression expressionForVariable:@"geometryType"];
+ return [NSExpression expressionForVariable:@"mgl_geometryType"];
} else if ([op isEqualToString:@"id"]) {
- return [NSExpression expressionForVariable:@"featureId"];
+ return [NSExpression expressionForVariable:@"featureIdentifier"];
} else if ([op isEqualToString:@"properties"]) {
return [NSExpression expressionForVariable:@"featureProperties"];
} else if ([op isEqualToString:@"let"]) {
@@ -559,10 +572,10 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
if ([self.variable isEqualToString:@"zoomLevel"]) {
return @[@"zoom"];
}
- if ([self.variable isEqualToString:@"geometryType"]) {
+ if ([self.variable isEqualToString:@"mgl_geometryType"]) {
return @[@"geometry-type"];
}
- if ([self.variable isEqualToString:@"featureId"]) {
+ if ([self.variable isEqualToString:@"featureIdentifier"]) {
return @[@"id"];
}
if ([self.variable isEqualToString:@"featureProperties"]) {
@@ -663,9 +676,8 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
} else if ([function isEqualToString:@"stringByAppendingString:"]) {
NSArray *arguments = self.arguments.mgl_jsonExpressionObject;
return [@[@"concat", self.operand.mgl_jsonExpressionObject] arrayByAddingObjectsFromArray:arguments];
- } else if ([function isEqualToString:@"objectAtIndex:"]) {
- NSExpression *index = self.arguments[0];
- return @[@"at", index.mgl_jsonExpressionObject, self.operand.mgl_jsonExpressionObject];
+ } else if ([function isEqualToString:@"objectFrom:withIndex:"]) {
+ return @[@"at", self.arguments[1].mgl_jsonExpressionObject, self.arguments[0].mgl_jsonExpressionObject];
} else if ([function isEqualToString:@"boolValue"]) {
return @[@"to-boolean", self.operand.mgl_jsonExpressionObject];
} else if ([function isEqualToString:@"mgl_numberWithFallbackValues:"] ||
@@ -678,8 +690,12 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
return @[@"to-string", self.operand.mgl_jsonExpressionObject];
} else if ([function isEqualToString:@"noindex:"]) {
return self.arguments.firstObject.mgl_jsonExpressionObject;
- } else if ([function isEqualToString:@"has"]) {
- return @[@"has", self.operand.mgl_jsonExpressionObject];
+ } else if ([function isEqualToString:@"mgl_has:"]) {
+ NSMutableArray *expressionObject = [NSMutableArray arrayWithObjects:@"has", self.arguments[0].mgl_jsonExpressionObject, nil];
+ if (self.operand.expressionType == NSConstantValueExpressionType) {
+ [expressionObject addObject:self.operand.mgl_jsonExpressionObject];
+ }
+ return expressionObject;
} else if ([function isEqualToString:@"mgl_interpolateWithCurveType:parameters:stops:"]) {
if (self.arguments.count < 3) {
[NSException raise:NSInvalidArgumentException format:
diff --git a/platform/darwin/src/NSExpression+MGLPrivateAdditions.h b/platform/darwin/src/NSExpression+MGLPrivateAdditions.h
index b16e2625a0..f726dd3e71 100644
--- a/platform/darwin/src/NSExpression+MGLPrivateAdditions.h
+++ b/platform/darwin/src/NSExpression+MGLPrivateAdditions.h
@@ -62,6 +62,8 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) id mgl_jsonExpressionObject;
+- (id)mgl_has:(id)element;
+
@end
@interface MGLColor (MGLExpressionAdditions)
@@ -74,6 +76,8 @@ NS_ASSUME_NONNULL_BEGIN
- (NSExpression *)mgl_expressionWithContext:(NSDictionary<NSString *, NSExpression *> *)context;
+- (id)mgl_has:(id)element;
+
@end
extern NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects);
diff --git a/platform/darwin/test/MGLExpressionTests.mm b/platform/darwin/test/MGLExpressionTests.mm
index f489b3f79a..cf584ea2d5 100644
--- a/platform/darwin/test/MGLExpressionTests.mm
+++ b/platform/darwin/test/MGLExpressionTests.mm
@@ -171,15 +171,15 @@ using namespace std::string_literals;
XCTAssertEqualObjects([expression expressionValueWithObject:nil context:context], @1);
}
{
- NSExpression *expression = [NSExpression expressionForVariable:@"geometryType"];
+ NSExpression *expression = [NSExpression expressionForVariable:@"mgl_geometryType"];
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, @[@"geometry-type"]);
- XCTAssertEqualObjects([NSExpression expressionWithFormat:@"$geometryType"].mgl_jsonExpressionObject, @[@"geometry-type"]);
+ XCTAssertEqualObjects([NSExpression expressionWithFormat:@"$mgl_geometryType"].mgl_jsonExpressionObject, @[@"geometry-type"]);
XCTAssertEqualObjects([NSExpression mgl_expressionWithJSONObject:@[@"geometry-type"]], expression);
}
{
- NSExpression *expression = [NSExpression expressionForVariable:@"featureId"];
+ NSExpression *expression = [NSExpression expressionForVariable:@"featureIdentifier"];
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, @[@"id"]);
- XCTAssertEqualObjects([NSExpression expressionWithFormat:@"$featureId"].mgl_jsonExpressionObject, @[@"id"]);
+ XCTAssertEqualObjects([NSExpression expressionWithFormat:@"$featureIdentifier"].mgl_jsonExpressionObject, @[@"id"]);
XCTAssertEqualObjects([NSExpression mgl_expressionWithJSONObject:@[@"id"]], expression);
}
{
@@ -649,29 +649,35 @@ using namespace std::string_literals;
- (void)testLookupExpressionObject {
{
- NSExpression *operand = [NSExpression expressionForAggregate:@[MGLConstantExpression(@9),
+ NSExpression *array = [NSExpression expressionForAggregate:@[MGLConstantExpression(@9),
MGLConstantExpression(@8),
MGLConstantExpression(@7)]];
- NSExpression *expression = [NSExpression expressionWithFormat:@"FUNCTION(%@, 'objectAtIndex:', %@)", operand, MGLConstantExpression(@1)];
+ NSExpression *expression = [NSExpression expressionForFunction:@"objectFrom:withIndex:" arguments:@[array, MGLConstantExpression(@1)]];
NSArray *jsonExpression = @[@"at", @1, @[ @"literal", @[@9, @8, @7]]];
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
XCTAssertEqualObjects([NSExpression mgl_expressionWithJSONObject:jsonExpression], expression);
}
{
- NSExpression *operand = [NSExpression expressionForAggregate:@[MGLConstantExpression(@9),
+ NSExpression *array = [NSExpression expressionForAggregate:@[MGLConstantExpression(@9),
MGLConstantExpression(@8),
MGLConstantExpression(@7)]];
- NSExpression *expression = [NSExpression expressionWithFormat:@"FUNCTION(%@, 'objectAtIndex:', x)", operand];
+ NSExpression *expression = [NSExpression expressionForFunction:@"objectFrom:withIndex:" arguments:@[array, [NSExpression expressionForKeyPath:@"x"]]];
NSArray *jsonExpression = @[@"at", @[@"get", @"x"], @[ @"literal", @[@9, @8, @7]]];
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
XCTAssertEqualObjects([NSExpression mgl_expressionWithJSONObject:jsonExpression], expression);
}
{
- NSExpression *expression = [NSExpression expressionWithFormat:@"FUNCTION('x', 'has')"];
+ NSExpression *expression = [NSExpression expressionWithFormat:@"FUNCTION(self, 'mgl_has:', 'x')"];
NSArray *jsonExpression = @[@"has", @"x"];
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
XCTAssertEqualObjects([NSExpression mgl_expressionWithJSONObject:jsonExpression], expression);
}
+ {
+ NSExpression *expression = [NSExpression expressionWithFormat:@"FUNCTION(%@, 'mgl_has:', 'x')", [NSExpression expressionForConstantValue:@{@"x": MGLConstantExpression(@0)}]];
+ NSArray *jsonExpression = @[@"has", @"x", @[@"literal", @{@"x": @0}]];
+ XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
+ XCTAssertEqualObjects([NSExpression mgl_expressionWithJSONObject:jsonExpression], expression);
+ }
}
@end