diff --git a/src/mbgl/style/conversion/function.cpp b/src/mbgl/style/conversion/function.cpp index 34ac52ec1..5877d0eb7 100644 --- a/src/mbgl/style/conversion/function.cpp +++ b/src/mbgl/style/conversion/function.cpp @@ -700,6 +700,9 @@ optional> convertFunctionToExpression(type::Type typ [&] (const type::Array& array) -> optional> { return assertion(array, get(literal(*property))); }, + [&] (const type::FormattedType&) -> optional> { + return format(get(literal(*property))); + }, [&] (const auto&) -> optional> { assert(false); // No properties use this type. return nullopt; diff --git a/test/style/conversion/function.test.cpp b/test/style/conversion/function.test.cpp index 8ebdcdb9b..93a9a7e60 100644 --- a/test/style/conversion/function.test.cpp +++ b/test/style/conversion/function.test.cpp @@ -92,3 +92,21 @@ TEST(StyleConversion, TokenStrings) { ASSERT_EQ(*convertTokenStringToExpression("{token} {token"), *concat(vec(get(literal("token")), literal(" "), literal("{token")))); ASSERT_EQ(*convertTokenStringToExpression("{token {token}"), *concat(vec(literal("{token "), get(literal("token"))))); } + + +TEST(StyleConversion, FormattedIdentityFunction) { + // See https://github.com/mapbox/mapbox-gl-js/issues/7311 + // We never introduced this bug on gl-native, but we _almost_ did + Error error; + + auto parseFunction = [&](const std::string& json) { + return convertJSON>(json, error, true, false); + }; + + using namespace mbgl::style::expression::dsl; + + auto fn1 = parseFunction(R"({ "property": "name", "type": "identity" })"); + ASSERT_TRUE(bool(fn1)); + ASSERT_TRUE(fn1->isExpression()); + ASSERT_EQ(fn1->asExpression().getExpression(), *format(get(literal("name")))); +}