[ios, macos] Fix format expression parsing. (#14168)

Fixed a parsing issue when a non-constant expression was passed to MGLAttributedExpression.expression property.
This commit is contained in:
Fabian Guerra Soto
2019-03-20 10:49:23 -07:00
committed by GitHub
parent 3122df7e50
commit fc77090fce
2 changed files with 25 additions and 13 deletions

View File

@@ -1016,14 +1016,10 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
if ([constantValue isKindOfClass:[MGLAttributedExpression class]]) {
MGLAttributedExpression *attributedExpression = (MGLAttributedExpression *)constantValue;
id jsonObject = attributedExpression.expression.mgl_jsonExpressionObject;
NSMutableArray *attributes = [NSMutableArray array];
if ([jsonObject isKindOfClass:[NSArray class]]) {
[attributes addObjectsFromArray:jsonObject];
} else {
[attributes addObject:jsonObject];
}
NSMutableDictionary *attributedDictionary = [NSMutableDictionary dictionary];
if (attributedExpression.attributes) {
NSMutableDictionary *attributedDictionary = [NSMutableDictionary dictionaryWithDictionary:attributedExpression.attributes];
attributedDictionary = [NSMutableDictionary dictionaryWithDictionary:attributedExpression.attributes];
if (attributedDictionary[MGLFontNamesAttribute]) {
attributedDictionary[MGLFontNamesAttribute] = @[@"literal", attributedDictionary[MGLFontNamesAttribute]];
}
@@ -1031,12 +1027,8 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
MGLColor *color = attributedDictionary[MGLFontColorAttribute];
attributedDictionary[MGLFontColorAttribute] = color.mgl_jsonExpressionObject;
}
[attributes addObject:attributedDictionary];
} else {
[attributes addObject:@{}];
}
return attributes;
}
return @[jsonObject, attributedDictionary];
}
return self.constantValue;
}

View File

@@ -1062,6 +1062,14 @@ using namespace std::string_literals;
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
XCTAssertEqualObjects([NSExpression expressionWithMGLJSONObject:jsonExpression], expression);
}
{
MGLAttributedExpression *attribute1 = [[MGLAttributedExpression alloc] initWithExpression:[NSExpression expressionForConstantValue:@"foo"]] ;
NSExpression *expression = [NSExpression expressionWithFormat:@"mgl_attributed:(%@)", MGLConstantExpression(attribute1)];
NSArray *jsonExpression = @[ @"format", @"foo", @{ } ];
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
XCTAssertEqualObjects([NSExpression expressionWithMGLJSONObject:jsonExpression], expression);
}
{
MGLAttributedExpression *attribute1 = [[MGLAttributedExpression alloc] initWithExpression:[NSExpression expressionForConstantValue:@"foo"]
attributes:@{ MGLFontSizeAttribute: @(1.2),
@@ -1086,6 +1094,18 @@ using namespace std::string_literals;
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
XCTAssertEqualObjects([NSExpression expressionWithMGLJSONObject:jsonExpression], expression);
}
{
MGLAttributedExpression *attribute1 = [[MGLAttributedExpression alloc] initWithExpression:[NSExpression expressionWithFormat:@"CAST(x, 'NSString')"]
attributes:@{ MGLFontSizeAttribute: @(1.2),
MGLFontColorAttribute: [MGLColor redColor],
MGLFontNamesAttribute: @[ @"DIN Offc Pro Bold", @"Arial Unicode MS Bold" ]
}] ;
NSExpression *expression = [NSExpression expressionWithFormat:@"mgl_attributed:(%@)", MGLConstantExpression(attribute1)];
NSArray *jsonExpression = @[ @"format", @[@"to-string", @[@"get", @"x"]], @{ @"font-scale": @1.2, @"text-color": @[@"rgb", @255, @0, @0] , @"text-font" : @[ @"literal", @[ @"DIN Offc Pro Bold", @"Arial Unicode MS Bold" ]]} ];
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
XCTAssertEqualObjects([NSExpression expressionWithMGLJSONObject:jsonExpression], expression);
}
{
MGLAttributedExpression *attribute1 = [MGLAttributedExpression attributedExpression:[NSExpression expressionForConstantValue:@"foo"]
fontNames:nil