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
// 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
// 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.
//

@ -22,6 +22,7 @@
#include "google/protobuf/compiler/code_generator.h"
#include "absl/status/status.h"
#include "google/protobuf/cpp_features.pb.h"
#include "google/protobuf/descriptor.pb.h"
// Must be included last.
#include "google/protobuf/port_def.inc"
@ -72,6 +73,9 @@ class PROTOC_EXPORT CppGenerator : public CodeGenerator {
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 {
return {GetExtensionReflection(pb::cpp)};
}

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

@ -16,6 +16,7 @@
#include "google/protobuf/compiler/code_generator.h"
#include "google/protobuf/descriptor.h"
#include "google/protobuf/descriptor.pb.h"
// Must be included last
#include "google/protobuf/port_def.inc"
@ -48,6 +49,8 @@ class PROTOC_EXPORT ObjectiveCGenerator : public CodeGenerator {
uint64_t GetSupportedFeatures() const override {
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

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

@ -36,6 +36,8 @@ class PROTOC_EXPORT RustGenerator final
uint64_t GetSupportedFeatures() const override {
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

Loading…
Cancel
Save