From ae3df5c67698be0f0e7b39367640115d917477fc Mon Sep 17 00:00:00 2001 From: Fabian Guerra Date: Wed, 28 Mar 2018 14:40:28 -0400 Subject: [ios, macos] Refactor expressions variable name and 'mgl_has' implementation. --- platform/darwin/src/NSExpression+MGLAdditions.mm | 38 +++++++++++++++------- .../darwin/src/NSExpression+MGLPrivateAdditions.h | 4 +++ platform/darwin/test/MGLExpressionTests.mm | 24 +++++++++----- 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 *)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 -- cgit v1.2.1