Make generators explicitly specify their support window for editions.

Plugins should not get automatically bumped to the latest edition until they're ready to support it.

PiperOrigin-RevId: 572638914
pull/14341/head
Mike Kruskal 1 year ago committed by Copybara-Service
parent 1df8ea4988
commit 15c04bf1bc
  1. 4
      src/google/protobuf/compiler/code_generator.h
  2. 4
      src/google/protobuf/compiler/cpp/generator.h
  3. 3
      src/google/protobuf/compiler/mock_code_generator.cc
  4. 3
      src/google/protobuf/compiler/objectivec/generator.h
  5. 19
      src/google/protobuf/compiler/plugin.cc
  6. 2
      src/google/protobuf/compiler/rust/generator.h

@ -119,11 +119,11 @@ class PROTOC_EXPORT CodeGenerator {
// Returns the minimum edition (inclusive) supported by this generator. Any // Returns the minimum edition (inclusive) supported by this generator. Any
// proto files with an edition before this will result in an error. // proto files with an edition before this will result in an error.
virtual Edition GetMinimumEdition() const { return PROTOBUF_MINIMUM_EDITION; } virtual Edition GetMinimumEdition() const { return Edition::EDITION_UNKNOWN; }
// Returns the maximum edition (inclusive) supported by this generator. Any // Returns the maximum edition (inclusive) supported by this generator. Any
// proto files with an edition after this will result in an error. // proto files with an edition after this will result in an error.
virtual Edition GetMaximumEdition() const { return PROTOBUF_MAXIMUM_EDITION; } virtual Edition GetMaximumEdition() const { return Edition::EDITION_UNKNOWN; }
// Builds a default feature set mapping for this generator. // Builds a default feature set mapping for this generator.
// //

@ -22,6 +22,7 @@
#include "google/protobuf/compiler/code_generator.h" #include "google/protobuf/compiler/code_generator.h"
#include "absl/status/status.h" #include "absl/status/status.h"
#include "google/protobuf/cpp_features.pb.h" #include "google/protobuf/cpp_features.pb.h"
#include "google/protobuf/descriptor.pb.h"
// Must be included last. // Must be included last.
#include "google/protobuf/port_def.inc" #include "google/protobuf/port_def.inc"
@ -72,6 +73,9 @@ class PROTOC_EXPORT CppGenerator : public CodeGenerator {
return FEATURE_PROTO3_OPTIONAL | FEATURE_SUPPORTS_EDITIONS; return FEATURE_PROTO3_OPTIONAL | FEATURE_SUPPORTS_EDITIONS;
} }
Edition GetMinimumEdition() const override { return Edition::EDITION_PROTO2; }
Edition GetMaximumEdition() const override { return Edition::EDITION_2023; }
std::vector<const FieldDescriptor*> GetFeatureExtensions() const override { std::vector<const FieldDescriptor*> GetFeatureExtensions() const override {
return {GetExtensionReflection(pb::cpp)}; return {GetExtensionReflection(pb::cpp)};
} }

@ -204,7 +204,8 @@ bool MockCodeGenerator::Generate(const FileDescriptor* file,
GeneratorContext* context, GeneratorContext* context,
std::string* error) const { std::string* error) const {
if (FileDescriptorLegacy(file).syntax() == if (FileDescriptorLegacy(file).syntax() ==
FileDescriptorLegacy::SYNTAX_EDITIONS) { FileDescriptorLegacy::SYNTAX_EDITIONS &&
(suppressed_features_ & CodeGenerator::FEATURE_SUPPORTS_EDITIONS) == 0) {
internal::VisitDescriptors(*file, [&](const auto& descriptor) { internal::VisitDescriptors(*file, [&](const auto& descriptor) {
const FeatureSet& features = GetResolvedSourceFeatures(descriptor); const FeatureSet& features = GetResolvedSourceFeatures(descriptor);
ABSL_CHECK(features.HasExtension(pb::test)) ABSL_CHECK(features.HasExtension(pb::test))

@ -16,6 +16,7 @@
#include "google/protobuf/compiler/code_generator.h" #include "google/protobuf/compiler/code_generator.h"
#include "google/protobuf/descriptor.h" #include "google/protobuf/descriptor.h"
#include "google/protobuf/descriptor.pb.h"
// Must be included last // Must be included last
#include "google/protobuf/port_def.inc" #include "google/protobuf/port_def.inc"
@ -48,6 +49,8 @@ class PROTOC_EXPORT ObjectiveCGenerator : public CodeGenerator {
uint64_t GetSupportedFeatures() const override { uint64_t GetSupportedFeatures() const override {
return (FEATURE_PROTO3_OPTIONAL | FEATURE_SUPPORTS_EDITIONS); return (FEATURE_PROTO3_OPTIONAL | FEATURE_SUPPORTS_EDITIONS);
} }
Edition GetMinimumEdition() const override { return Edition::EDITION_PROTO2; }
Edition GetMaximumEdition() const override { return Edition::EDITION_2023; }
}; };
} // namespace objectivec } // namespace objectivec

@ -94,15 +94,18 @@ bool GenerateCode(const CodeGeneratorRequest& request,
CodeGeneratorResponse* response, std::string* error_msg) { CodeGeneratorResponse* response, std::string* error_msg) {
DescriptorPool pool; DescriptorPool pool;
// Initialize feature set default mapping. if (generator.GetSupportedFeatures() &
absl::StatusOr<FeatureSetDefaults> defaults = CodeGenerator::FEATURE_SUPPORTS_EDITIONS) {
generator.BuildFeatureSetDefaults(); // Initialize feature set default mapping.
if (!defaults.ok()) { absl::StatusOr<FeatureSetDefaults> defaults =
*error_msg = absl::StrCat("error generating feature defaults: ", generator.BuildFeatureSetDefaults();
defaults.status().message()); if (!defaults.ok()) {
return false; *error_msg = absl::StrCat("error generating feature defaults: ",
defaults.status().message());
return false;
}
pool.SetFeatureSetDefaults(*defaults);
} }
pool.SetFeatureSetDefaults(*defaults);
for (int i = 0; i < request.proto_file_size(); i++) { for (int i = 0; i < request.proto_file_size(); i++) {
const FileDescriptor* file = pool.BuildFile(request.proto_file(i)); const FileDescriptor* file = pool.BuildFile(request.proto_file(i));

@ -36,6 +36,8 @@ class PROTOC_EXPORT RustGenerator final
uint64_t GetSupportedFeatures() const override { uint64_t GetSupportedFeatures() const override {
return FEATURE_PROTO3_OPTIONAL | FEATURE_SUPPORTS_EDITIONS; return FEATURE_PROTO3_OPTIONAL | FEATURE_SUPPORTS_EDITIONS;
} }
Edition GetMinimumEdition() const override { return Edition::EDITION_PROTO2; }
Edition GetMaximumEdition() const override { return Edition::EDITION_2023; }
}; };
} // namespace rust } // namespace rust

Loading…
Cancel
Save