diff --git a/api_generator/api_generator/generators/kotlin/kotlin_entities.py b/api_generator/api_generator/generators/kotlin/kotlin_entities.py index 60de65204..25479f0fe 100644 --- a/api_generator/api_generator/generators/kotlin/kotlin_entities.py +++ b/api_generator/api_generator/generators/kotlin/kotlin_entities.py @@ -528,7 +528,8 @@ class KotlinEntity(Entity): property_name=property.name + '_item', with_template_validators=False )) - + if property.supports_expressions and property.default_value_definition is not None: + arg_list.append(property.default_value_var_name) args = ', '.join(filter(lambda arg: arg, arg_list)) default_value = property.default_value_coalescing(GenerationMode.NORMAL_WITH_TEMPLATES) return Text(f'{property.declaration_name} = JsonFieldResolver.resolve{optionality_prefix}{expression_prefix}{collection_prefix}({args}){default_value},') diff --git a/api_generator/tests/references/serializers_kotlin/EntityWithPropertyWithDefaultValueJsonParser.kt b/api_generator/tests/references/serializers_kotlin/EntityWithPropertyWithDefaultValueJsonParser.kt index cf778f6ef..02e9961d5 100644 --- a/api_generator/tests/references/serializers_kotlin/EntityWithPropertyWithDefaultValueJsonParser.kt +++ b/api_generator/tests/references/serializers_kotlin/EntityWithPropertyWithDefaultValueJsonParser.kt @@ -77,9 +77,9 @@ internal class EntityWithPropertyWithDefaultValueJsonParser( override fun resolve(context: ParsingContext, template: EntityWithPropertyWithDefaultValueTemplate, data: JSONObject): EntityWithPropertyWithDefaultValue { val logger = context.logger return EntityWithPropertyWithDefaultValue( - int = JsonFieldResolver.resolveOptionalExpression(context, logger, template.int, data, "int", TYPE_HELPER_INT, NUMBER_TO_INT, INT_VALIDATOR) ?: INT_DEFAULT_VALUE, + int = JsonFieldResolver.resolveOptionalExpression(context, logger, template.int, data, "int", TYPE_HELPER_INT, NUMBER_TO_INT, INT_VALIDATOR, INT_DEFAULT_VALUE) ?: INT_DEFAULT_VALUE, nested = JsonFieldResolver.resolveOptional(context, logger, template.nested, data, "nested", component.entityWithPropertyWithDefaultValueNestedJsonTemplateResolver, component.entityWithPropertyWithDefaultValueNestedJsonEntityParser), - url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI, URL_VALIDATOR) ?: URL_DEFAULT_VALUE, + url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI, URL_VALIDATOR, URL_DEFAULT_VALUE) ?: URL_DEFAULT_VALUE, ) } } @@ -156,9 +156,9 @@ internal class EntityWithPropertyWithDefaultValueNestedJsonParser( override fun resolve(context: ParsingContext, template: EntityWithPropertyWithDefaultValueTemplate.NestedTemplate, data: JSONObject): EntityWithPropertyWithDefaultValue.Nested { val logger = context.logger return EntityWithPropertyWithDefaultValue.Nested( - int = JsonFieldResolver.resolveOptionalExpression(context, logger, template.int, data, "int", TYPE_HELPER_INT, NUMBER_TO_INT, INT_VALIDATOR) ?: INT_DEFAULT_VALUE, + int = JsonFieldResolver.resolveOptionalExpression(context, logger, template.int, data, "int", TYPE_HELPER_INT, NUMBER_TO_INT, INT_VALIDATOR, INT_DEFAULT_VALUE) ?: INT_DEFAULT_VALUE, nonOptional = JsonFieldResolver.resolveExpression(context, logger, template.nonOptional, data, "non_optional", TYPE_HELPER_STRING), - url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI, URL_VALIDATOR) ?: URL_DEFAULT_VALUE, + url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI, URL_VALIDATOR, URL_DEFAULT_VALUE) ?: URL_DEFAULT_VALUE, ) } } diff --git a/api_generator/tests/references/serializers_kotlin/EntityWithSimplePropertiesJsonParser.kt b/api_generator/tests/references/serializers_kotlin/EntityWithSimplePropertiesJsonParser.kt index 99314de52..516b6657d 100644 --- a/api_generator/tests/references/serializers_kotlin/EntityWithSimplePropertiesJsonParser.kt +++ b/api_generator/tests/references/serializers_kotlin/EntityWithSimplePropertiesJsonParser.kt @@ -106,7 +106,7 @@ internal class EntityWithSimplePropertiesJsonParser( color = JsonFieldResolver.resolveOptionalExpression(context, logger, template.color, data, "color", TYPE_HELPER_COLOR, STRING_TO_COLOR_INT), double = JsonFieldResolver.resolveOptionalExpression(context, logger, template.double, data, "double", TYPE_HELPER_DOUBLE, NUMBER_TO_DOUBLE), id = JsonFieldResolver.resolveOptional(context, logger, template.id, data, "id", NUMBER_TO_INT) ?: ID_DEFAULT_VALUE, - integer = JsonFieldResolver.resolveOptionalExpression(context, logger, template.integer, data, "integer", TYPE_HELPER_INT, NUMBER_TO_INT) ?: INTEGER_DEFAULT_VALUE, + integer = JsonFieldResolver.resolveOptionalExpression(context, logger, template.integer, data, "integer", TYPE_HELPER_INT, NUMBER_TO_INT, INTEGER_DEFAULT_VALUE) ?: INTEGER_DEFAULT_VALUE, positiveInteger = JsonFieldResolver.resolveOptionalExpression(context, logger, template.positiveInteger, data, "positive_integer", TYPE_HELPER_INT, NUMBER_TO_INT, POSITIVE_INTEGER_VALIDATOR), string = JsonFieldResolver.resolveOptionalExpression(context, logger, template.string, data, "string", TYPE_HELPER_STRING), url = JsonFieldResolver.resolveOptionalExpression(context, logger, template.url, data, "url", TYPE_HELPER_URI, STRING_TO_URI), diff --git a/api_generator/tests/references/serializers_kotlin/EntityWithStringEnumPropertyWithDefaultValueJsonParser.kt b/api_generator/tests/references/serializers_kotlin/EntityWithStringEnumPropertyWithDefaultValueJsonParser.kt index f9d196dd0..ce8c16dc3 100644 --- a/api_generator/tests/references/serializers_kotlin/EntityWithStringEnumPropertyWithDefaultValueJsonParser.kt +++ b/api_generator/tests/references/serializers_kotlin/EntityWithStringEnumPropertyWithDefaultValueJsonParser.kt @@ -69,7 +69,7 @@ internal class EntityWithStringEnumPropertyWithDefaultValueJsonParser( override fun resolve(context: ParsingContext, template: EntityWithStringEnumPropertyWithDefaultValueTemplate, data: JSONObject): EntityWithStringEnumPropertyWithDefaultValue { val logger = context.logger return EntityWithStringEnumPropertyWithDefaultValue( - value = JsonFieldResolver.resolveOptionalExpression(context, logger, template.value, data, "value", TYPE_HELPER_VALUE, EntityWithStringEnumPropertyWithDefaultValue.Value.FROM_STRING) ?: VALUE_DEFAULT_VALUE, + value = JsonFieldResolver.resolveOptionalExpression(context, logger, template.value, data, "value", TYPE_HELPER_VALUE, EntityWithStringEnumPropertyWithDefaultValue.Value.FROM_STRING, VALUE_DEFAULT_VALUE) ?: VALUE_DEFAULT_VALUE, ) } } diff --git a/client/android/div-data/src/main/java/com/yandex/div/internal/parser/JsonFieldResolver.java b/client/android/div-data/src/main/java/com/yandex/div/internal/parser/JsonFieldResolver.java index 13f0f8456..8bdd98926 100644 --- a/client/android/div-data/src/main/java/com/yandex/div/internal/parser/JsonFieldResolver.java +++ b/client/android/div-data/src/main/java/com/yandex/div/internal/parser/JsonFieldResolver.java @@ -300,6 +300,30 @@ public class JsonFieldResolver { return null; } + @Nullable + public static Expression resolveOptionalExpression( + @NonNull final ParsingContext context, + @NonNull final ParsingErrorLogger logger, + @NonNull final Field> field, + @NonNull final JSONObject data, + @NonNull final String key, + @NonNull final TypeHelper typeHelper, + @Nullable final Expression defaultValue + ) { + if (field.overridable && data.has(key)) { + return JsonExpressionParser.readOptionalExpression( + context, logger, data, key, typeHelper, doNotConvert(), defaultValue); + } else if (field.type == Field.TYPE_VALUE) { + return ((Field.Value>) field).value; + } else if (field.type == Field.TYPE_REFERENCE) { + String reference = ((Field.Reference) field).reference; + return JsonExpressionParser.readOptionalExpression( + context, logger, data, reference, typeHelper, doNotConvert(), defaultValue); + } + + return null; + } + @Nullable public static Expression resolveOptionalExpression( @NonNull final ParsingContext context, @@ -322,6 +346,31 @@ public class JsonFieldResolver { return null; } + @Nullable + public static Expression resolveOptionalExpression( + @NonNull final ParsingContext context, + @NonNull final ParsingErrorLogger logger, + @NonNull final Field> field, + @NonNull final JSONObject data, + @NonNull final String key, + @NonNull final TypeHelper typeHelper, + @NonNull final Function1 converter, + @Nullable final Expression defaultValue + ) { + if (field.overridable && data.has(key)) { + return JsonExpressionParser.readOptionalExpression( + context, logger, data, key, typeHelper, converter, defaultValue); + } else if (field.type == Field.TYPE_VALUE){ + return ((Field.Value>) field).value; + } else if (field.type == Field.TYPE_REFERENCE) { + String reference = ((Field.Reference) field).reference; + return JsonExpressionParser.readOptionalExpression( + context, logger, data, reference, typeHelper, converter, defaultValue); + } + + return null; + } + @Nullable public static Expression resolveOptionalExpression( @NonNull final ParsingContext context, @@ -344,6 +393,31 @@ public class JsonFieldResolver { return null; } + @Nullable + public static Expression resolveOptionalExpression( + @NonNull final ParsingContext context, + @NonNull final ParsingErrorLogger logger, + @NonNull final Field> field, + @NonNull final JSONObject data, + @NonNull final String key, + @NonNull final TypeHelper typeHelper, + @NonNull final ValueValidator validator, + @Nullable final Expression defaultValue + ) { + if (field.overridable && data.has(key)) { + return JsonExpressionParser.readOptionalExpression( + context, logger, data, key, typeHelper, validator, defaultValue); + } else if (field.type == Field.TYPE_VALUE) { + return ((Field.Value>) field).value; + } else if (field.type == Field.TYPE_REFERENCE) { + String reference = ((Field.Reference) field).reference; + return JsonExpressionParser.readOptionalExpression( + context, logger, data, reference, typeHelper, validator, defaultValue); + } + + return null; + } + @Nullable public static Expression resolveOptionalExpression( @NonNull final ParsingContext context, @@ -357,13 +431,39 @@ public class JsonFieldResolver { ) { if (field.overridable && data.has(key)) { return JsonExpressionParser.readOptionalExpression( - context, logger, data, key, typeHelper, converter, validator); + context, logger, data, key, typeHelper, converter, validator, null); } else if (field.type == Field.TYPE_VALUE) { return ((Field.Value>) field).value; } else if (field.type == Field.TYPE_REFERENCE) { String reference = ((Field.Reference) field).reference; return JsonExpressionParser.readOptionalExpression( - context, logger, data, reference, typeHelper, converter, validator); + context, logger, data, reference, typeHelper, converter, validator, null); + } + + return null; + } + + @Nullable + public static Expression resolveOptionalExpression( + @NonNull final ParsingContext context, + @NonNull final ParsingErrorLogger logger, + @NonNull final Field> field, + @NonNull final JSONObject data, + @NonNull final String key, + @NonNull final TypeHelper typeHelper, + @NonNull final Function1 converter, + @NonNull final ValueValidator validator, + @Nullable final Expression defaultValue + ) { + if (field.overridable && data.has(key)) { + return JsonExpressionParser.readOptionalExpression( + context, logger, data, key, typeHelper, converter, validator, defaultValue); + } else if (field.type == Field.TYPE_VALUE) { + return ((Field.Value>) field).value; + } else if (field.type == Field.TYPE_REFERENCE) { + String reference = ((Field.Reference) field).reference; + return JsonExpressionParser.readOptionalExpression( + context, logger, data, reference, typeHelper, converter, validator, defaultValue); } return null;