Skip to content

Commit 1b400c6

Browse files
thedavekwonfacebook-github-bot
authored andcommitted
Introduce is_deprecated_terse_writes_with_custom_default_field
Summary: This is useful to detect if there is no redundant custom default for deprecated terse write fields. Reviewed By: iahs Differential Revision: D68839815 fbshipit-source-id: 35202a8a660f6f618055a39941ed73e8a022f427
1 parent 003bdb6 commit 1b400c6

File tree

7 files changed

+89
-0
lines changed

7 files changed

+89
-0
lines changed

thrift/compiler/generate/t_mstch_cpp2_generator.cc

+10
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include <thrift/compiler/sema/ast_validator.h>
3939
#include <thrift/compiler/sema/schematizer.h>
4040
#include <thrift/compiler/sema/sema_context.h>
41+
#include <thrift/compiler/sema/standard_validator.h>
4142

4243
using apache::thrift::compiler::detail::schematizer;
4344

@@ -1863,6 +1864,9 @@ class cpp_mstch_field : public mstch_field {
18631864
{"field:enum_has_value", &cpp_mstch_field::enum_has_value},
18641865
{"field:deprecated_terse_writes?",
18651866
&cpp_mstch_field::deprecated_terse_writes},
1867+
{"field:deprecated_terse_writes_with_non_redundant_custom_default?",
1868+
&cpp_mstch_field::
1869+
deprecated_terse_writes_with_non_redundant_custom_default},
18661870
{"field:fatal_annotations?",
18671871
&cpp_mstch_field::has_fatal_annotations},
18681872
{"field:fatal_annotations", &cpp_mstch_field::fatal_annotations},
@@ -2076,6 +2080,12 @@ class cpp_mstch_field : public mstch_field {
20762080
(has_option("deprecated_terse_writes") &&
20772081
cpp2::deprecated_terse_writes(field_));
20782082
}
2083+
mstch::node deprecated_terse_writes_with_non_redundant_custom_default() {
2084+
return std::get<bool>(deprecated_terse_writes()) &&
2085+
field_->default_value() &&
2086+
!detail::is_initializer_default_value(
2087+
field_->type().deref(), *field_->default_value());
2088+
}
20792089
mstch::node zero_copy_arg() {
20802090
switch (field_->get_type()->get_type_value()) {
20812091
case t_type::type::t_binary:

thrift/compiler/generate/templates/cpp2/module_types.h.mustache

+4
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ struct is_cpp_ref_field_optional<{{struct:cpp_fullname}},::apache::thrift::type:
7979
template<>
8080
struct is_cpp_ref_field_terse<{{struct:cpp_fullname}},::apache::thrift::type::field_id<{{field:key}}>> : std::true_type{};
8181
{{/field:terse_cpp_ref?}}
82+
{{#if field:deprecated_terse_writes_with_non_redundant_custom_default?}}
83+
template<>
84+
struct is_deprecated_terse_writes_with_custom_default_field<{{struct:cpp_fullname}},::apache::thrift::type::field_id<{{field:key}}>> : std::true_type{};
85+
{{/if field:deprecated_terse_writes_with_non_redundant_custom_default?}}
8286
{{/struct:fields}}
8387
{{/program:structs}}
8488
} // namespace apache::thrift::detail::qualifier

thrift/compiler/test/fixtures/mcpp2-compare/out/cpp2/gen-cpp2/module_types.h

+30
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,32 @@ namespace apache::thrift::detail::annotation {
10881088

10891089
namespace apache::thrift::detail::qualifier {
10901090
template<>
1091+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::MyStruct,::apache::thrift::type::field_id<2>> : std::true_type{};
1092+
template<>
1093+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::MyStruct,::apache::thrift::type::field_id<3>> : std::true_type{};
1094+
template<>
1095+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::MyStruct,::apache::thrift::type::field_id<9>> : std::true_type{};
1096+
template<>
1097+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::AnException,::apache::thrift::type::field_id<3>> : std::true_type{};
1098+
template<>
1099+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::containerStruct,::apache::thrift::type::field_id<3>> : std::true_type{};
1100+
template<>
1101+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::containerStruct,::apache::thrift::type::field_id<5>> : std::true_type{};
1102+
template<>
1103+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::containerStruct,::apache::thrift::type::field_id<6>> : std::true_type{};
1104+
template<>
1105+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::containerStruct,::apache::thrift::type::field_id<9>> : std::true_type{};
1106+
template<>
1107+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::containerStruct,::apache::thrift::type::field_id<10>> : std::true_type{};
1108+
template<>
1109+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::containerStruct,::apache::thrift::type::field_id<18>> : std::true_type{};
1110+
template<>
1111+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::containerStruct,::apache::thrift::type::field_id<19>> : std::true_type{};
1112+
template<>
1113+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::containerStruct,::apache::thrift::type::field_id<22>> : std::true_type{};
1114+
template<>
1115+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::MyIncludedStruct,::apache::thrift::type::field_id<1>> : std::true_type{};
1116+
template<>
10911117
struct is_cpp_ref_field_optional<::some::valid::ns::AnnotatedStruct,::apache::thrift::type::field_id<8>> : std::true_type{};
10921118
template<>
10931119
struct is_cpp_ref_field_optional<::some::valid::ns::AnnotatedStruct,::apache::thrift::type::field_id<9>> : std::true_type{};
@@ -1099,6 +1125,10 @@ template<>
10991125
struct is_cpp_ref_field_optional<::some::valid::ns::AnnotatedStruct,::apache::thrift::type::field_id<18>> : std::true_type{};
11001126
template<>
11011127
struct is_cpp_ref_field_optional<::some::valid::ns::AnnotatedStruct,::apache::thrift::type::field_id<19>> : std::true_type{};
1128+
template<>
1129+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::AnnotatedStruct,::apache::thrift::type::field_id<38>> : std::true_type{};
1130+
template<>
1131+
struct is_deprecated_terse_writes_with_custom_default_field<::some::valid::ns::AnnotatedStruct,::apache::thrift::type::field_id<39>> : std::true_type{};
11021132
} // namespace apache::thrift::detail::qualifier
11031133

11041134
// BEGIN hash_and_equal_to

thrift/compiler/test/fixtures/terse_write/out/cpp2_deprecated_terse_writ/gen-cpp2/deprecated_terse_write_types.h

+26
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,32 @@ namespace apache::thrift::detail::annotation {
455455
} // namespace apache::thrift::detail::annotation
456456

457457
namespace apache::thrift::detail::qualifier {
458+
template<>
459+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<1>> : std::true_type{};
460+
template<>
461+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<2>> : std::true_type{};
462+
template<>
463+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<3>> : std::true_type{};
464+
template<>
465+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<4>> : std::true_type{};
466+
template<>
467+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<5>> : std::true_type{};
468+
template<>
469+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<6>> : std::true_type{};
470+
template<>
471+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<7>> : std::true_type{};
472+
template<>
473+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<8>> : std::true_type{};
474+
template<>
475+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<9>> : std::true_type{};
476+
template<>
477+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<10>> : std::true_type{};
478+
template<>
479+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<11>> : std::true_type{};
480+
template<>
481+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<12>> : std::true_type{};
482+
template<>
483+
struct is_deprecated_terse_writes_with_custom_default_field<::facebook::thrift::test::terse_write::deprecated::DeprecatedTerseWriteWithCustomDefault,::apache::thrift::type::field_id<13>> : std::true_type{};
458484
} // namespace apache::thrift::detail::qualifier
459485

460486
// BEGIN hash_and_equal_to

thrift/lib/cpp2/Thrift.h

+6
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,12 @@ template <class Struct, class Id>
451451
struct is_cpp_ref_field_terse : std::false_type {
452452
static_assert(sizeof(Struct), "Struct must be a complete type.");
453453
};
454+
// Identify a field has deprecated terse write optimization with custom default
455+
// value specified in IDL which differs from the intrinsic default value.
456+
template <class Struct, class Id>
457+
struct is_deprecated_terse_writes_with_custom_default_field : std::false_type {
458+
static_assert(sizeof(Struct), "Struct must be a complete type.");
459+
};
454460
} // namespace qualifier
455461

456462
} // namespace detail

thrift/test/StructTest.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,16 @@ bool serializedField(const T& t) {
766766
TEST_F(StructTest, TerseFields) {
767767
TerseFieldsWithCustomDefault terse;
768768

769+
static_assert(apache::thrift::detail::qualifier::
770+
is_deprecated_terse_writes_with_custom_default_field<
771+
TerseFieldsWithCustomDefault,
772+
type::field_id<4>>::value);
773+
// redundant custom default
774+
static_assert(!apache::thrift::detail::qualifier::
775+
is_deprecated_terse_writes_with_custom_default_field<
776+
TerseFieldsWithCustomDefault,
777+
type::field_id<19>>::value);
778+
769779
// Primitive types
770780
EXPECT_EQ(terse.bool_field(), true);
771781
EXPECT_EQ(terse.byte_field(), 10);

thrift/test/structs_terse.thrift

+3
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,7 @@ struct TerseFieldsWithCustomDefault {
179179
@cpp.AllowLegacyNonOptionalRef
180180
@cpp.DeprecatedTerseWrite
181181
18: NestedException cpp_ref_exception_field;
182+
183+
@cpp.DeprecatedTerseWrite
184+
19: i32 redundant_custom_default = 0;
182185
}

0 commit comments

Comments
 (0)