Fix generation of C++ code with Optional<Enum> (#6155)

This commit is contained in:
Vladimir Glavnyy
2020-10-03 00:27:30 +07:00
committed by GitHub
parent 0bdf2fa156
commit bbcc85fd4c
4 changed files with 11 additions and 10 deletions

View File

@@ -1598,7 +1598,9 @@ class CppGenerator : public BaseGenerator {
std::string GetDefaultScalarValue(const FieldDef &field, bool is_ctor) { std::string GetDefaultScalarValue(const FieldDef &field, bool is_ctor) {
const auto &type = field.value.type; const auto &type = field.value.type;
if (type.enum_def && IsScalar(type.base_type)) { if (field.IsScalarOptional()) {
return GenOptionalNull();
} else if (type.enum_def && IsScalar(type.base_type)) {
auto ev = type.enum_def->FindByValue(field.value.constant); auto ev = type.enum_def->FindByValue(field.value.constant);
if (ev) { if (ev) {
return WrapInNameSpace(type.enum_def->defined_namespace, return WrapInNameSpace(type.enum_def->defined_namespace,
@@ -1620,8 +1622,7 @@ class CppGenerator : public BaseGenerator {
return "0"; return "0";
} }
} else { } else {
return field.IsScalarOptional() ? GenOptionalNull() return GenDefaultConstant(field);
: GenDefaultConstant(field);
} }
} }
@@ -1647,13 +1648,11 @@ class CppGenerator : public BaseGenerator {
code_.SetValue("PARAM_VALUE", "nullptr"); code_.SetValue("PARAM_VALUE", "nullptr");
} else { } else {
const auto &type = field.value.type; const auto &type = field.value.type;
if (field.IsScalarOptional()) { code_.SetValue("PARAM_VALUE", GetDefaultScalarValue(field, false));
if (field.IsScalarOptional())
code_.SetValue("PARAM_TYPE", GenOptionalDecl(type)); code_.SetValue("PARAM_TYPE", GenOptionalDecl(type));
code_.SetValue("PARAM_VALUE", GenOptionalNull()); else
} else {
code_.SetValue("PARAM_TYPE", GenTypeWire(type, " ", true)); code_.SetValue("PARAM_TYPE", GenTypeWire(type, " ", true));
code_.SetValue("PARAM_VALUE", GetDefaultScalarValue(field, false));
}
} }
code_ += "{{PRE}}{{PARAM_TYPE}}{{PARAM_NAME}} = {{PARAM_VALUE}}\\"; code_ += "{{PRE}}{{PARAM_TYPE}}{{PARAM_NAME}} = {{PARAM_VALUE}}\\";
} }

View File

@@ -77,7 +77,7 @@ struct ScalarStuffT : public flatbuffers::NativeTable {
flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt; flatbuffers::Optional<double> maybe_f64 = flatbuffers::nullopt;
double default_f64 = 42.0; double default_f64 = 42.0;
bool just_bool = false; bool just_bool = false;
flatbuffers::Optional<bool> maybe_bool = true; flatbuffers::Optional<bool> maybe_bool = flatbuffers::nullopt;
bool default_bool = true; bool default_bool = true;
optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte::None; optional_scalars::OptionalByte just_enum = optional_scalars::OptionalByte::None;
optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte::One; optional_scalars::OptionalByte default_enum = optional_scalars::OptionalByte::One;

View File

@@ -116,7 +116,7 @@ struct ScalarStuffT : public flatbuffers::NativeTable {
maybe_f64(flatbuffers::nullopt), maybe_f64(flatbuffers::nullopt),
default_f64(42.0), default_f64(42.0),
just_bool(false), just_bool(false),
maybe_bool(true), maybe_bool(flatbuffers::nullopt),
default_bool(true), default_bool(true),
just_enum(optional_scalars::OptionalByte_None), just_enum(optional_scalars::OptionalByte_None),
default_enum(optional_scalars::OptionalByte_One) { default_enum(optional_scalars::OptionalByte_One) {

View File

@@ -3516,6 +3516,8 @@ void OptionalScalarsTest() {
TEST_ASSERT(!opts->mutate_maybe_i16(-10)); TEST_ASSERT(!opts->mutate_maybe_i16(-10));
optional_scalars::ScalarStuffT obj; optional_scalars::ScalarStuffT obj;
TEST_ASSERT(!obj.maybe_bool);
TEST_ASSERT(!obj.maybe_f32.has_value());
opts->UnPackTo(&obj); opts->UnPackTo(&obj);
TEST_ASSERT(!obj.maybe_bool); TEST_ASSERT(!obj.maybe_bool);
TEST_ASSERT(!obj.maybe_f32.has_value()); TEST_ASSERT(!obj.maybe_f32.has_value());