diff --git a/src/google/protobuf/compiler/cpp/helpers.cc b/src/google/protobuf/compiler/cpp/helpers.cc index f994743f5abca..a4eca1a472054 100644 --- a/src/google/protobuf/compiler/cpp/helpers.cc +++ b/src/google/protobuf/compiler/cpp/helpers.cc @@ -117,6 +117,14 @@ MessageKnownNonNullaryMethodsSnakeCase() { return *methods; } +// TODO(crbug.com/332939935): This is used to allow generating an AnyLite proto +// compatible with /third_party/medialite instead of checking in compiled +// protobufs that complicate rolling. +// Upstream should be fixed so that we don't need to generate a separate +// AnyLite, then this patch/change should be dropped. +constexpr absl::string_view kAnyLiteMessageName = "AnyLite"; +constexpr absl::string_view kAnyLiteProtoFile = "google/protobuf/any_lite.proto"; + static const char* const kKeywordList[] = { // clang-format off "NULL", @@ -1345,11 +1353,13 @@ bool IsStringOrMessage(const FieldDescriptor* field) { } bool IsAnyMessage(const FileDescriptor* descriptor) { - return descriptor->name() == kAnyProtoFile; + return descriptor->name() == kAnyProtoFile || + descriptor->name() == kAnyLiteProtoFile; } bool IsAnyMessage(const Descriptor* descriptor) { - return descriptor->name() == kAnyMessageName && + return (descriptor->name() == kAnyMessageName || + descriptor->name() == kAnyLiteMessageName) && IsAnyMessage(descriptor->file()); } diff --git a/src/google/protobuf/compiler/cpp/message.cc b/src/google/protobuf/compiler/cpp/message.cc index 2566bec49c3ce..d5a7de27d06bf 100644 --- a/src/google/protobuf/compiler/cpp/message.cc +++ b/src/google/protobuf/compiler/cpp/message.cc @@ -2395,30 +2395,34 @@ void MessageGenerator::GenerateClassMethods(io::Printer* p) { return; } if (IsAnyMessage(descriptor_)) { - p->Emit({{"any_field_descriptor", - [&] { - if (!HasDescriptorMethods(descriptor_->file(), options_)) { - return; + // TODO(crbug.com/332939935): Remove this workaround when the AnyLite patch + // can go away. + if (descriptor_->name() != "AnyLite") { + p->Emit({{"any_field_descriptor", + [&] { + if (!HasDescriptorMethods(descriptor_->file(), options_)) { + return; + } + p->Emit( + R"cc( + bool $classname$::GetAnyFieldDescriptors( + const $pb$::Message& message, + const $pb$::FieldDescriptor** type_url_field, + const $pb$::FieldDescriptor** value_field) { + return ::_pbi::GetAnyFieldDescriptors(message, type_url_field, value_field); + } + )cc"); + }}}, + R"cc( + $any_field_descriptor$; + bool $classname$::ParseAnyTypeUrl( + //~ + ::absl::string_view type_url, + std::string* $nonnull$ full_type_name) { + return ::_pbi::ParseAnyTypeUrl(type_url, full_type_name); } - p->Emit( - R"cc( - bool $classname$::GetAnyFieldDescriptors( - const $pb$::Message& message, - const $pb$::FieldDescriptor** type_url_field, - const $pb$::FieldDescriptor** value_field) { - return ::_pbi::GetAnyFieldDescriptors(message, type_url_field, value_field); - } - )cc"); - }}}, - R"cc( - $any_field_descriptor$; - bool $classname$::ParseAnyTypeUrl( - //~ - ::absl::string_view type_url, - std::string* $nonnull$ full_type_name) { - return ::_pbi::ParseAnyTypeUrl(type_url, full_type_name); - } - )cc"); + )cc"); + } } p->Emit( {{"has_bit",