Skip to content

Commit 4d5ab73

Browse files
mkruskal-googlecopybara-github
authored andcommitted
Create a reflection helper for ExtensionIdentifier.
This will allow easy access to the FieldDescriptor of a generated extension. PiperOrigin-RevId: 561480962
1 parent 9c76ea4 commit 4d5ab73

File tree

7 files changed

+40
-18
lines changed

7 files changed

+40
-18
lines changed

src/google/protobuf/compiler/code_generator_unittest.cc

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ class TestGenerator : public CodeGenerator {
9595
absl::string_view minimum_edition_ = PROTOBUF_MINIMUM_EDITION;
9696
absl::string_view maximum_edition_ = PROTOBUF_MAXIMUM_EDITION;
9797
std::vector<const FieldDescriptor*> feature_extensions_ = {
98-
DescriptorPool::generated_pool()->FindExtensionByNumber(
99-
FeatureSet::descriptor(), pb::test.number())};
98+
GetExtensionReflection(pb::test)};
10099
};
101100

102101
class SimpleErrorCollector : public io::ErrorCollector {
@@ -190,9 +189,7 @@ TEST_F(CodeGeneratorTest, GetUnresolvedSourceFeaturesInherited) {
190189

191190
TEST_F(CodeGeneratorTest, GetResolvedSourceFeaturesRoot) {
192191
TestGenerator generator;
193-
generator.set_feature_extensions(
194-
{DescriptorPool::generated_pool()->FindExtensionByNumber(
195-
FeatureSet::descriptor(), pb::test.number())});
192+
generator.set_feature_extensions({GetExtensionReflection(pb::test)});
196193
pool_.SetFeatureSetDefaults(*generator.BuildFeatureSetDefaults());
197194

198195
ASSERT_THAT(BuildFile(DescriptorProto::descriptor()->file()), NotNull());
@@ -225,9 +222,7 @@ TEST_F(CodeGeneratorTest, GetResolvedSourceFeaturesRoot) {
225222

226223
TEST_F(CodeGeneratorTest, GetResolvedSourceFeaturesInherited) {
227224
TestGenerator generator;
228-
generator.set_feature_extensions(
229-
{DescriptorPool::generated_pool()->FindExtensionByNumber(
230-
FeatureSet::descriptor(), pb::test.number())});
225+
generator.set_feature_extensions({GetExtensionReflection(pb::test)});
231226
pool_.SetFeatureSetDefaults(*generator.BuildFeatureSetDefaults());
232227

233228
ASSERT_THAT(BuildFile(DescriptorProto::descriptor()->file()), NotNull());

src/google/protobuf/compiler/command_line_interface_unittest.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,8 +1482,7 @@ TEST_F(CommandLineInterfaceTest, FeatureExtensionError) {
14821482
})schema");
14831483

14841484
mock_generator_->set_feature_extensions(
1485-
{DescriptorPool::generated_pool()->FindExtensionByNumber(
1486-
FeatureSet::descriptor(), pb::test_invalid.number())});
1485+
{GetExtensionReflection(pb::test_invalid)});
14871486

14881487
Run("protocol_compiler --proto_path=$tmpdir --test_out=$tmpdir "
14891488
"--experimental_editions foo.proto");

src/google/protobuf/compiler/cpp/generator.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ class PROTOC_EXPORT CppGenerator : public CodeGenerator {
9696
}
9797

9898
std::vector<const FieldDescriptor*> GetFeatureExtensions() const override {
99-
return {DescriptorPool::generated_pool()->FindExtensionByNumber(
100-
FeatureSet::descriptor(), pb::cpp.number())};
99+
return {GetExtensionReflection(pb::cpp)};
101100
}
102101

103102
private:

src/google/protobuf/compiler/mock_code_generator.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,7 @@ class MockCodeGenerator : public CodeGenerator {
149149
absl::string_view minimum_edition_ = PROTOBUF_MINIMUM_EDITION;
150150
absl::string_view maximum_edition_ = PROTOBUF_MAXIMUM_EDITION;
151151
std::vector<const FieldDescriptor*> feature_extensions_ = {
152-
DescriptorPool::generated_pool()->FindExtensionByNumber(
153-
FeatureSet::descriptor(), pb::test.number())};
152+
GetExtensionReflection(pb::test)};
154153

155154
static std::string GetOutputFileContent(absl::string_view generator_name,
156155
absl::string_view parameter,

src/google/protobuf/descriptor_unittest.cc

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7246,10 +7246,9 @@ class FeaturesTest : public FeaturesBaseTest {
72467246

72477247
auto default_spec = FeatureResolver::CompileDefaults(
72487248
FeatureSet::descriptor(),
7249-
{pb::CppFeatures::descriptor()->file()->extension(0),
7250-
pb::TestFeatures::descriptor()->file()->extension(0),
7251-
pb::TestMessage::descriptor()->extension(0),
7252-
pb::TestMessage::Nested::descriptor()->extension(0)},
7249+
{GetExtensionReflection(pb::cpp), GetExtensionReflection(pb::test),
7250+
GetExtensionReflection(pb::TestMessage::test_message),
7251+
GetExtensionReflection(pb::TestMessage::Nested::test_nested)},
72537252
"2023", "2025");
72547253
ASSERT_OK(default_spec);
72557254
pool_.SetFeatureSetDefaults(std::move(default_spec).value());

src/google/protobuf/extension_set.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1554,6 +1554,9 @@ template <>
15541554
class ExtensionIdentifier<FeatureSet, MessageTypeTraits<::pb::CppFeatures>, 11,
15551555
false> {
15561556
public:
1557+
using TypeTraits = MessageTypeTraits<::pb::CppFeatures>;
1558+
using Extendee = FeatureSet;
1559+
15571560
explicit constexpr ExtensionIdentifier(int number) : number_(number) {}
15581561

15591562
int number() const { return number_; }
@@ -1612,6 +1615,21 @@ void LinkExtensionReflection(
16121615
internal::StrongReference(extension);
16131616
}
16141617

1618+
// Returns the field descriptor for a generated extension identifier. This is
1619+
// useful when doing reflection over generated extensions.
1620+
template <typename ExtendeeType, typename TypeTraitsType,
1621+
internal::FieldType field_type, bool is_packed,
1622+
typename PoolType = DescriptorPool>
1623+
const FieldDescriptor* GetExtensionReflection(
1624+
const google::protobuf::internal::ExtensionIdentifier<
1625+
ExtendeeType, TypeTraitsType, field_type, is_packed>& extension) {
1626+
return PoolType::generated_pool()->FindExtensionByNumber(
1627+
google::protobuf::internal::ExtensionIdentifier<ExtendeeType, TypeTraitsType,
1628+
field_type,
1629+
is_packed>::Extendee::descriptor(),
1630+
extension.number());
1631+
}
1632+
16151633
} // namespace protobuf
16161634
} // namespace google
16171635

src/google/protobuf/extension_set_unittest.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "absl/strings/cord.h"
4242
#include "absl/strings/match.h"
4343
#include "google/protobuf/arena.h"
44+
#include "google/protobuf/cpp_features.pb.h"
4445
#include "google/protobuf/descriptor.h"
4546
#include "google/protobuf/dynamic_message.h"
4647
#include "google/protobuf/io/coded_stream.h"
@@ -1430,6 +1431,18 @@ TEST(ExtensionSetTest, ExtensionSetSpaceUsed) {
14301431
EXPECT_TRUE((l2 - l) > (l3 - l));
14311432
}
14321433

1434+
TEST(ExtensionSetTest, Descriptor) {
1435+
EXPECT_EQ(
1436+
GetExtensionReflection(unittest::optional_int32_extension),
1437+
unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
1438+
"optional_int32_extension"));
1439+
EXPECT_NE(GetExtensionReflection(unittest::optional_int32_extension),
1440+
nullptr);
1441+
EXPECT_EQ(GetExtensionReflection(pb::cpp),
1442+
pb::CppFeatures::descriptor()->file()->FindExtensionByName("cpp"));
1443+
EXPECT_NE(GetExtensionReflection(pb::cpp), nullptr);
1444+
}
1445+
14331446
} // namespace
14341447
} // namespace internal
14351448
} // namespace protobuf

0 commit comments

Comments
 (0)