Remove PROTOBUF_FUTURE_EDITIONS guards.

This is just cruft used for selectively rolling out the editions changes.  Since it's not tested, it would be dangerous to keep it in place.

PiperOrigin-RevId: 547979600
pull/13315/head
Mike Kruskal 2 years ago committed by Copybara-Service
parent f254501c65
commit 6098c0227d
  1. 3
      src/google/protobuf/compiler/code_generator.h
  2. 8
      src/google/protobuf/compiler/command_line_interface.cc
  3. 2
      src/google/protobuf/compiler/command_line_interface.h
  4. 4
      src/google/protobuf/compiler/command_line_interface_unittest.cc
  5. 6
      src/google/protobuf/compiler/cpp/generator.cc
  6. 6
      src/google/protobuf/compiler/cpp/generator_unittest.cc
  7. 2
      src/google/protobuf/compiler/cpp/helpers.cc
  8. 2
      src/google/protobuf/compiler/objectivec/file.cc
  9. 14
      src/google/protobuf/compiler/parser.cc
  10. 4
      src/google/protobuf/compiler/parser.h
  11. 2
      src/google/protobuf/compiler/parser_unittest.cc
  12. 183
      src/google/protobuf/descriptor.cc
  13. 82
      src/google/protobuf/descriptor.h
  14. 2
      src/google/protobuf/descriptor_legacy.h
  15. 33
      src/google/protobuf/descriptor_unittest.cc
  16. 6
      src/google/protobuf/extension_set.h
  17. 4
      src/google/protobuf/port_def.inc

@ -130,8 +130,6 @@ class PROTOC_EXPORT CodeGenerator {
// method can be removed. // method can be removed.
virtual bool HasGenerateAll() const { return true; } virtual bool HasGenerateAll() const { return true; }
#ifdef PROTOBUF_FUTURE_EDITIONS
protected: protected:
// Retrieves the resolved source features for a given descriptor. These // Retrieves the resolved source features for a given descriptor. These
// should be used to make any feature-based decisions during code generation. // should be used to make any feature-based decisions during code generation.
@ -157,7 +155,6 @@ class PROTOC_EXPORT CodeGenerator {
StripSourceRetentionOptions(*file.pool(), proto); StripSourceRetentionOptions(*file.pool(), proto);
return proto; return proto;
} }
#endif // PROTOBUF_FUTURE_EDITIONS
}; };
// CodeGenerators generate one or more files in a given directory. This // CodeGenerators generate one or more files in a given directory. This

@ -1554,7 +1554,6 @@ bool CommandLineInterface::ParseInputFiles(
} }
parsed_files->push_back(parsed_file); parsed_files->push_back(parsed_file);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (!experimental_editions_ && !IsEarlyEditionsFile(parsed_file->name())) { if (!experimental_editions_ && !IsEarlyEditionsFile(parsed_file->name())) {
if (FileDescriptorLegacy(parsed_file).syntax() == if (FileDescriptorLegacy(parsed_file).syntax() ==
FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS) { FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS) {
@ -1568,7 +1567,6 @@ bool CommandLineInterface::ParseInputFiles(
break; break;
} }
} }
#endif // PROTOBUF_FUTURE_EDITIONS
// Enforce --disallow_services. // Enforce --disallow_services.
if (disallow_services_ && parsed_file->service_count() > 0) { if (disallow_services_ && parsed_file->service_count() > 0) {
@ -1619,9 +1617,7 @@ void CommandLineInterface::Clear() {
descriptor_set_out_name_.clear(); descriptor_set_out_name_.clear();
dependency_out_name_.clear(); dependency_out_name_.clear();
#ifdef PROTOBUF_FUTURE_EDITIONS
experimental_editions_ = false; experimental_editions_ = false;
#endif // PROTOBUF_FUTURE_EDITIONS
mode_ = MODE_COMPILE; mode_ = MODE_COMPILE;
print_mode_ = PRINT_NONE; print_mode_ = PRINT_NONE;
@ -1940,9 +1936,7 @@ bool CommandLineInterface::ParseArgument(const char* arg, std::string* name,
*name == "--include_imports" || *name == "--include_source_info" || *name == "--include_imports" || *name == "--include_source_info" ||
*name == "--retain_options" || *name == "--version" || *name == "--retain_options" || *name == "--version" ||
*name == "--decode_raw" || *name == "--decode_raw" ||
#ifdef PROTOBUF_FUTURE_EDITIONS
*name == "--experimental_editions" || *name == "--experimental_editions" ||
#endif // PROTOBUF_FUTURE_EDITIONS
*name == "--print_free_field_numbers" || *name == "--print_free_field_numbers" ||
*name == "--experimental_allow_proto3_optional" || *name == "--experimental_allow_proto3_optional" ||
*name == "--deterministic_output" || *name == "--fatal_warnings") { *name == "--deterministic_output" || *name == "--fatal_warnings") {
@ -2269,14 +2263,12 @@ CommandLineInterface::InterpretArgument(const std::string& name,
#else #else
::setenv(io::Printer::kProtocCodegenTrace.data(), "yes", 0); ::setenv(io::Printer::kProtocCodegenTrace.data(), "yes", 0);
#endif #endif
#ifdef PROTOBUF_FUTURE_EDITIONS
} else if (name == "--experimental_editions") { } else if (name == "--experimental_editions") {
// If you're reading this, you're probably wondering what // If you're reading this, you're probably wondering what
// --experimental_editions is for and thinking of turning it on. This is an // --experimental_editions is for and thinking of turning it on. This is an
// experimental, undocumented, unsupported flag. Enable it at your own risk // experimental, undocumented, unsupported flag. Enable it at your own risk
// (or, just don't!). // (or, just don't!).
experimental_editions_ = true; experimental_editions_ = true;
#endif // PROTOBUF_FUTURE_EDITIONS
} else { } else {
// Some other flag. Look it up in the generators list. // Some other flag. Look it up in the generators list.
const GeneratorInfo* generator_info = FindGeneratorByFlag(name); const GeneratorInfo* generator_info = FindGeneratorByFlag(name);

@ -450,9 +450,7 @@ class PROTOC_EXPORT CommandLineInterface {
// dependency file will be written. Otherwise, empty. // dependency file will be written. Otherwise, empty.
std::string dependency_out_name_; std::string dependency_out_name_;
#ifdef PROTOBUF_FUTURE_EDITIONS
bool experimental_editions_ = false; bool experimental_editions_ = false;
#endif // PROTOBUF_FUTURE_EDITIONS
// True if --include_imports was given, meaning that we should // True if --include_imports was given, meaning that we should
// write all transitive dependencies to the DescriptorSet. Otherwise, only // write all transitive dependencies to the DescriptorSet. Otherwise, only

@ -1346,8 +1346,6 @@ TEST_F(CommandLineInterfaceTest, AllowServicesHasService) {
ExpectGenerated("test_generator", "", "foo.proto", "Foo"); ExpectGenerated("test_generator", "", "foo.proto", "Foo");
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
TEST_F(CommandLineInterfaceTest, EditionsAreNotAllowed) { TEST_F(CommandLineInterfaceTest, EditionsAreNotAllowed) {
CreateTempFile("foo.proto", CreateTempFile("foo.proto",
"edition = \"very-cool\";\n" "edition = \"very-cool\";\n"
@ -1678,8 +1676,6 @@ TEST_F(CommandLineInterfaceTest, PluginNoEditionsSupport) {
"code generator prefix-gen-plug hasn't been updated to support editions"); "code generator prefix-gen-plug hasn't been updated to support editions");
} }
#endif // PROTOBUF_FUTURE_EDITIONS
TEST_F(CommandLineInterfaceTest, DirectDependencies_Missing_EmptyList) { TEST_F(CommandLineInterfaceTest, DirectDependencies_Missing_EmptyList) {
CreateTempFile("foo.proto", CreateTempFile("foo.proto",

@ -46,12 +46,10 @@
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "google/protobuf/compiler/cpp/file.h" #include "google/protobuf/compiler/cpp/file.h"
#include "google/protobuf/compiler/cpp/helpers.h" #include "google/protobuf/compiler/cpp/helpers.h"
#include "google/protobuf/cpp_features.pb.h"
#include "google/protobuf/descriptor.pb.h" #include "google/protobuf/descriptor.pb.h"
#include "google/protobuf/descriptor_visitor.h" #include "google/protobuf/descriptor_visitor.h"
#ifdef PROTOBUF_FUTURE_EDITIONS
#include "google/protobuf/cpp_features.pb.h"
#endif // PROTOBUF_FUTURE_EDITIONS
namespace google { namespace google {
namespace protobuf { namespace protobuf {
@ -367,7 +365,6 @@ bool CppGenerator::Generate(const FileDescriptor* file,
absl::Status CppGenerator::ValidateFeatures(const FileDescriptor* file) const { absl::Status CppGenerator::ValidateFeatures(const FileDescriptor* file) const {
absl::Status status = absl::OkStatus(); absl::Status status = absl::OkStatus();
#ifdef PROTOBUF_FUTURE_EDITIONS
google::protobuf::internal::VisitDescriptors(*file, [&](const FieldDescriptor& field) { google::protobuf::internal::VisitDescriptors(*file, [&](const FieldDescriptor& field) {
const FeatureSet& source_features = GetSourceFeatures(field); const FeatureSet& source_features = GetSourceFeatures(field);
const FeatureSet& raw_features = GetSourceRawFeatures(field); const FeatureSet& raw_features = GetSourceRawFeatures(field);
@ -385,7 +382,6 @@ absl::Status CppGenerator::ValidateFeatures(const FileDescriptor* file) const {
" has a closed enum type with implicit presence.")); " has a closed enum type with implicit presence."));
} }
}); });
#endif // PROTOBUF_FUTURE_EDITIONS
return status; return status;
} }

@ -35,9 +35,7 @@
#include "google/protobuf/descriptor.pb.h" #include "google/protobuf/descriptor.pb.h"
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include "google/protobuf/compiler/command_line_interface_tester.h" #include "google/protobuf/compiler/command_line_interface_tester.h"
#ifdef PROTOBUF_FUTURE_EDITIONS
#include "google/protobuf/cpp_features.pb.h" #include "google/protobuf/cpp_features.pb.h"
#endif // PROTOBUF_FUTURE_EDITIONS
namespace google { namespace google {
namespace protobuf { namespace protobuf {
@ -55,10 +53,8 @@ class CppGeneratorTest : public CommandLineInterfaceTester {
CreateTempFile( CreateTempFile(
"google/protobuf/descriptor.proto", "google/protobuf/descriptor.proto",
google::protobuf::DescriptorProto::descriptor()->file()->DebugString()); google::protobuf::DescriptorProto::descriptor()->file()->DebugString());
#ifdef PROTOBUF_FUTURE_EDITIONS
CreateTempFile("google/protobuf/cpp_features.proto", CreateTempFile("google/protobuf/cpp_features.proto",
pb::CppFeatures::descriptor()->file()->DebugString()); pb::CppFeatures::descriptor()->file()->DebugString());
#endif // PROTOBUF_FUTURE_EDITIONS
} }
}; };
@ -91,7 +87,6 @@ TEST_F(CppGeneratorTest, BasicError) {
"foo.proto:4:7: Expected \"required\", \"optional\", or \"repeated\""); "foo.proto:4:7: Expected \"required\", \"optional\", or \"repeated\"");
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
TEST_F(CppGeneratorTest, LegacyClosedEnumOnNonEnumField) { TEST_F(CppGeneratorTest, LegacyClosedEnumOnNonEnumField) {
CreateTempFile("foo.proto", CreateTempFile("foo.proto",
@ -176,7 +171,6 @@ TEST_F(CppGeneratorTest, LegacyClosedEnumImplicit) {
ExpectErrorSubstring( ExpectErrorSubstring(
"Field Foo.bar has a closed enum type with implicit presence."); "Field Foo.bar has a closed enum type with implicit presence.");
} }
#endif // PROTOBUF_FUTURE_EDITIONS
} // namespace } // namespace
} // namespace cpp } // namespace cpp

@ -1418,10 +1418,8 @@ bool GetBootstrapBasename(const Options& options, absl::string_view basename,
new absl::flat_hash_map<absl::string_view, std::string>{ new absl::flat_hash_map<absl::string_view, std::string>{
{"net/proto2/proto/descriptor", {"net/proto2/proto/descriptor",
"third_party/protobuf/descriptor"}, "third_party/protobuf/descriptor"},
#ifdef PROTOBUF_FUTURE_EDITIONS
{"third_party/protobuf/cpp_features", {"third_party/protobuf/cpp_features",
"third_party/protobuf/cpp_features"}, "third_party/protobuf/cpp_features"},
#endif // PROTOBUF_FUTURE_EDITIONS
{"third_party/protobuf/compiler/plugin", {"third_party/protobuf/compiler/plugin",
"third_party/protobuf/compiler/plugin"}, "third_party/protobuf/compiler/plugin"},
{"net/proto2/compiler/proto/profile", {"net/proto2/compiler/proto/profile",

@ -700,11 +700,9 @@ void FileGenerator::EmitFileDescription(io::Printer* p) const {
case FileDescriptorLegacy::Syntax::SYNTAX_PROTO3: case FileDescriptorLegacy::Syntax::SYNTAX_PROTO3:
syntax = "GPBFileSyntaxProto3"; syntax = "GPBFileSyntaxProto3";
break; break;
#ifdef PROTOBUF_FUTURE_EDITIONS
case FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS: case FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS:
syntax = "GPBFileSyntaxProtoEditions"; syntax = "GPBFileSyntaxProtoEditions";
break; break;
#endif // PROTOBUF_FUTURE_EDITIONS
} }
p->Emit({{"file_description_name", file_description_name_}, p->Emit({{"file_description_name", file_description_name_},

@ -662,9 +662,7 @@ bool Parser::Parse(io::Tokenizer* input, FileDescriptorProto* file) {
DescriptorPool::ErrorCollector::OTHER); DescriptorPool::ErrorCollector::OTHER);
if (require_syntax_identifier_ || LookingAt("syntax") if (require_syntax_identifier_ || LookingAt("syntax")
#ifdef PROTOBUF_FUTURE_EDITIONS
|| LookingAt("edition") || LookingAt("edition")
#endif // PROTOBUF_FUTURE_EDITIONS
) { ) {
if (!ParseSyntaxIdentifier(file, root_location)) { if (!ParseSyntaxIdentifier(file, root_location)) {
// Don't attempt to parse the file if we didn't recognize the syntax // Don't attempt to parse the file if we didn't recognize the syntax
@ -674,11 +672,9 @@ bool Parser::Parse(io::Tokenizer* input, FileDescriptorProto* file) {
// Store the syntax into the file. // Store the syntax into the file.
if (file != nullptr) { if (file != nullptr) {
file->set_syntax(syntax_identifier_); file->set_syntax(syntax_identifier_);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (syntax_identifier_ == "editions") { if (syntax_identifier_ == "editions") {
file->set_edition(edition_); file->set_edition(edition_);
} }
#endif // PROTOBUF_FUTURE_EDITIONS
} }
} else if (!stop_after_syntax_identifier_) { } else if (!stop_after_syntax_identifier_) {
ABSL_LOG(WARNING) << "No syntax specified for the proto file: " ABSL_LOG(WARNING) << "No syntax specified for the proto file: "
@ -718,20 +714,16 @@ bool Parser::ParseSyntaxIdentifier(const FileDescriptorProto* file,
const LocationRecorder& parent) { const LocationRecorder& parent) {
LocationRecorder syntax_location(parent, LocationRecorder syntax_location(parent,
FileDescriptorProto::kSyntaxFieldNumber); FileDescriptorProto::kSyntaxFieldNumber);
#ifdef PROTOBUF_FUTURE_EDITIONS
syntax_location.RecordLegacyLocation( syntax_location.RecordLegacyLocation(
file, DescriptorPool::ErrorCollector::EDITIONS); file, DescriptorPool::ErrorCollector::EDITIONS);
bool has_edition = false; bool has_edition = false;
if (TryConsume("edition")) { if (TryConsume("edition")) {
has_edition = true; has_edition = true;
} else { } else {
#endif // PROTOBUF_FUTURE_EDITIONS
DO(Consume("syntax", DO(Consume("syntax",
"File must begin with a syntax statement, e.g. 'syntax = " "File must begin with a syntax statement, e.g. 'syntax = "
"\"proto2\";'.")); "\"proto2\";'."));
#ifdef PROTOBUF_FUTURE_EDITIONS
} }
#endif // PROTOBUF_FUTURE_EDITIONS
DO(Consume("=")); DO(Consume("="));
io::Tokenizer::Token syntax_token = input_->current(); io::Tokenizer::Token syntax_token = input_->current();
@ -739,7 +731,6 @@ bool Parser::ParseSyntaxIdentifier(const FileDescriptorProto* file,
DO(ConsumeString(&syntax, "Expected syntax identifier.")); DO(ConsumeString(&syntax, "Expected syntax identifier."));
DO(ConsumeEndOfDeclaration(";", &syntax_location)); DO(ConsumeEndOfDeclaration(";", &syntax_location));
#ifdef PROTOBUF_FUTURE_EDITIONS
(has_edition ? edition_ : syntax_identifier_) = syntax; (has_edition ? edition_ : syntax_identifier_) = syntax;
if (has_edition) { if (has_edition) {
if (syntax.empty()) { if (syntax.empty()) {
@ -751,7 +742,6 @@ bool Parser::ParseSyntaxIdentifier(const FileDescriptorProto* file,
syntax_identifier_ = "editions"; syntax_identifier_ = "editions";
return true; return true;
} }
#endif // PROTOBUF_FUTURE_EDITIONS
syntax_identifier_ = syntax; syntax_identifier_ = syntax;
if (syntax != "proto2" && syntax != "proto3" && if (syntax != "proto2" && syntax != "proto3" &&
!stop_after_syntax_identifier_) { !stop_after_syntax_identifier_) {
@ -2343,7 +2333,6 @@ bool Parser::ParseLabel(FieldDescriptorProto::Label* label,
!LookingAt("required")) { !LookingAt("required")) {
return false; return false;
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
if (LookingAt("optional") && syntax_identifier_ == "editions") { if (LookingAt("optional") && syntax_identifier_ == "editions") {
RecordError( RecordError(
"Label \"optional\" is not supported in editions. By default, all " "Label \"optional\" is not supported in editions. By default, all "
@ -2354,7 +2343,6 @@ bool Parser::ParseLabel(FieldDescriptorProto::Label* label,
"Label \"required\" is not supported in editions, use " "Label \"required\" is not supported in editions, use "
"features.field_presence = LEGACY_REQUIRED."); "features.field_presence = LEGACY_REQUIRED.");
} }
#endif // PROTOBUF_FUTURE_EDITIONS
LocationRecorder location(field_location, LocationRecorder location(field_location,
FieldDescriptorProto::kLabelFieldNumber); FieldDescriptorProto::kLabelFieldNumber);
@ -2374,7 +2362,6 @@ bool Parser::ParseType(FieldDescriptorProto::Type* type,
const auto& type_names_table = GetTypeNameTable(); const auto& type_names_table = GetTypeNameTable();
auto iter = type_names_table.find(input_->current().text); auto iter = type_names_table.find(input_->current().text);
if (iter != type_names_table.end()) { if (iter != type_names_table.end()) {
#ifdef PROTOBUF_FUTURE_EDITIONS
if (syntax_identifier_ == "editions" && if (syntax_identifier_ == "editions" &&
iter->second == FieldDescriptorProto::TYPE_GROUP) { iter->second == FieldDescriptorProto::TYPE_GROUP) {
RecordError( RecordError(
@ -2382,7 +2369,6 @@ bool Parser::ParseType(FieldDescriptorProto::Type* type,
"behavior you can specify features.message_encoding = DELIMITED on a " "behavior you can specify features.message_encoding = DELIMITED on a "
"message field."); "message field.");
} }
#endif // PROTOBUF_FUTURE_EDITIONS
*type = iter->second; *type = iter->second;
input_->Next(); input_->Next();
} else { } else {

@ -530,9 +530,7 @@ class PROTOBUF_EXPORT Parser {
// Whether fields without label default to optional fields. // Whether fields without label default to optional fields.
bool DefaultToOptionalFields() const { bool DefaultToOptionalFields() const {
#ifdef PROTOBUF_FUTURE_EDITIONS
if (syntax_identifier_ == "editions") return true; if (syntax_identifier_ == "editions") return true;
#endif // PROTOBUF_FUTURE_EDITIONS
return syntax_identifier_ == "proto3"; return syntax_identifier_ == "proto3";
} }
@ -548,9 +546,7 @@ class PROTOBUF_EXPORT Parser {
bool require_syntax_identifier_; bool require_syntax_identifier_;
bool stop_after_syntax_identifier_; bool stop_after_syntax_identifier_;
std::string syntax_identifier_; std::string syntax_identifier_;
#ifdef PROTOBUF_FUTURE_EDITIONS
std::string edition_; std::string edition_;
#endif // PROTOBUF_FUTURE_EDITIONS
// Leading doc comments for the next declaration. These are not complete // Leading doc comments for the next declaration. These are not complete
// yet; use ConsumeEndOfDeclaration() to get the complete comments. // yet; use ConsumeEndOfDeclaration() to get the complete comments.

@ -3914,7 +3914,6 @@ TEST_F(SourceInfoTest, DocCommentsOneof) {
// =================================================================== // ===================================================================
#ifdef PROTOBUF_FUTURE_EDITIONS
typedef ParserTest ParseEditionsTest; typedef ParserTest ParseEditionsTest;
TEST_F(ParseEditionsTest, Editions) { TEST_F(ParseEditionsTest, Editions) {
@ -4143,7 +4142,6 @@ TEST_F(ParseEditionsTest, FeaturesWithoutEditions) {
"4:17: Features are only valid under editions.\n"); "4:17: Features are only valid under editions.\n");
} }
#endif // PROTOBUF_FUTURE_EDITIONS
} // anonymous namespace } // anonymous namespace

@ -71,15 +71,13 @@
#include "absl/synchronization/mutex.h" #include "absl/synchronization/mutex.h"
#include "absl/types/optional.h" #include "absl/types/optional.h"
#include "google/protobuf/any.h" #include "google/protobuf/any.h"
#include "google/protobuf/cpp_features.pb.h"
#include "google/protobuf/descriptor.pb.h" #include "google/protobuf/descriptor.pb.h"
#include "google/protobuf/descriptor_database.h" #include "google/protobuf/descriptor_database.h"
#include "google/protobuf/descriptor_legacy.h" #include "google/protobuf/descriptor_legacy.h"
#include "google/protobuf/descriptor_visitor.h" #include "google/protobuf/descriptor_visitor.h"
#include "google/protobuf/dynamic_message.h" #include "google/protobuf/dynamic_message.h"
#ifdef PROTOBUF_FUTURE_EDITIONS
#include "google/protobuf/cpp_features.pb.h"
#include "google/protobuf/feature_resolver.h" #include "google/protobuf/feature_resolver.h"
#endif // PROTOBUF_FUTURE_EDITIONS
#include "google/protobuf/generated_message_util.h" #include "google/protobuf/generated_message_util.h"
#include "google/protobuf/io/strtod.h" #include "google/protobuf/io/strtod.h"
#include "google/protobuf/io/tokenizer.h" #include "google/protobuf/io/tokenizer.h"
@ -838,10 +836,8 @@ const char* FileDescriptor::SyntaxName(FileDescriptor::Syntax syntax) {
return "proto2"; return "proto2";
case SYNTAX_PROTO3: case SYNTAX_PROTO3:
return "proto3"; return "proto3";
#ifdef PROTOBUF_FUTURE_EDITIONS
case SYNTAX_EDITIONS: case SYNTAX_EDITIONS:
return "editions"; return "editions";
#endif // !PROTOBUF_FUTURE_EDITIONS
case SYNTAX_UNKNOWN: case SYNTAX_UNKNOWN:
return "unknown"; return "unknown";
} }
@ -1114,8 +1110,6 @@ bool AllowedExtendeeInProto3(const std::string& name) {
allowed_proto3_extendees->end(); allowed_proto3_extendees->end();
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
// Create global defaults for proto2/proto3 compatibility. // Create global defaults for proto2/proto3 compatibility.
FeatureSet* CreateProto2DefaultFeatures() { FeatureSet* CreateProto2DefaultFeatures() {
FeatureSet* features = new FeatureSet(); FeatureSet* features = new FeatureSet();
@ -1247,7 +1241,6 @@ const FeatureSet& GetParentFeatures(const ServiceDescriptor* service) {
const FeatureSet& GetParentFeatures(const MethodDescriptor* method) { const FeatureSet& GetParentFeatures(const MethodDescriptor* method) {
return internal::InternalFeatureHelper::GetFeatures(*method->service()); return internal::InternalFeatureHelper::GetFeatures(*method->service());
} }
#endif // PROTOBUF_FUTURE_EDITIONS
} // anonymous namespace } // anonymous namespace
// Contains tables specific to a particular file. These tables are not // Contains tables specific to a particular file. These tables are not
@ -1363,15 +1356,11 @@ namespace internal {
class FlatAllocator class FlatAllocator
: public decltype(ApplyTypeList<FlatAllocatorImpl>( : public decltype(ApplyTypeList<FlatAllocatorImpl>(
SortByAlignment<char, std::string, SourceCodeInfo, SortByAlignment<char, std::string, SourceCodeInfo,
FileDescriptorTables, FileDescriptorTables, FeatureSet,
#ifdef PROTOBUF_FUTURE_EDITIONS // Option types
FeatureSet,
#endif // PROTOBUF_FUTURE_EDITIONS
// Option types
MessageOptions, FieldOptions, EnumOptions, MessageOptions, FieldOptions, EnumOptions,
EnumValueOptions, ExtensionRangeOptions, OneofOptions, EnumValueOptions, ExtensionRangeOptions, OneofOptions,
ServiceOptions, MethodOptions, FileOptions>())) { ServiceOptions, MethodOptions, FileOptions>())) {};
};
} // namespace internal } // namespace internal
@ -2009,10 +1998,8 @@ absl::string_view DescriptorPool::ErrorCollector::ErrorLocationName(
return "OUTPUT_TYPE"; return "OUTPUT_TYPE";
case IMPORT: case IMPORT:
return "IMPORT"; return "IMPORT";
#ifdef PROTOBUF_FUTURE_EDITIONS
case EDITIONS: case EDITIONS:
return "EDITIONS"; return "EDITIONS";
#endif // PROTOBUF_FUTURE_EDITIONS
case OTHER: case OTHER:
return "OTHER"; return "OTHER";
} }
@ -2125,9 +2112,7 @@ const DescriptorPool* DescriptorPool::generated_pool() {
// ensure that the linker --gc-sections step can strip out the full runtime if // ensure that the linker --gc-sections step can strip out the full runtime if
// it is unused. // it is unused.
DescriptorProto::descriptor(); DescriptorProto::descriptor();
#ifdef PROTOBUF_FUTURE_EDITIONS
pb::CppFeatures::descriptor(); pb::CppFeatures::descriptor();
#endif // PROTOBUF_FUTURE_EDITIONS
return pool; return pool;
} }
@ -2544,9 +2529,7 @@ void Descriptor::ExtensionRange::CopyTo(
if (options_ != &ExtensionRangeOptions::default_instance()) { if (options_ != &ExtensionRangeOptions::default_instance()) {
*proto->mutable_options() = *options_; *proto->mutable_options() = *options_;
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
RestoreFeaturesToOptions(proto_features_, proto); RestoreFeaturesToOptions(proto_features_, proto);
#endif // PROTOBUF_FUTURE_EDITIONS
} }
const Descriptor::ExtensionRange* const Descriptor::ExtensionRange*
@ -2759,7 +2742,6 @@ FileDescriptor::FileDescriptor() {}
// CopyTo methods ==================================================== // CopyTo methods ====================================================
#ifdef PROTOBUF_FUTURE_EDITIONS
namespace internal { namespace internal {
FileDescriptorProto InternalFeatureHelper::GetGeneratorProto( FileDescriptorProto InternalFeatureHelper::GetGeneratorProto(
const FileDescriptor& file) { const FileDescriptor& file) {
@ -2780,7 +2762,6 @@ FileDescriptorProto InternalFeatureHelper::GetGeneratorProto(
return file_proto; return file_proto;
} }
} // namespace internal } // namespace internal
#endif // PROTOBUF_FUTURE_EDITIONS
void FileDescriptor::CopyTo(FileDescriptorProto* proto) const { void FileDescriptor::CopyTo(FileDescriptorProto* proto) const {
CopyHeadingTo(proto); CopyHeadingTo(proto);
@ -2819,25 +2800,18 @@ void FileDescriptor::CopyHeadingTo(FileDescriptorProto* proto) const {
// TODO(liujisi): Also populate when syntax="proto2". // TODO(liujisi): Also populate when syntax="proto2".
FileDescriptorLegacy::Syntax syntax = FileDescriptorLegacy(this).syntax(); FileDescriptorLegacy::Syntax syntax = FileDescriptorLegacy(this).syntax();
if (syntax == FileDescriptorLegacy::Syntax::SYNTAX_PROTO3 if (syntax == FileDescriptorLegacy::Syntax::SYNTAX_PROTO3 ||
#ifdef PROTOBUF_FUTURE_EDITIONS syntax == FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS) {
|| syntax == FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS
#endif // !PROTOBUF_FUTURE_EDITIONS
) {
proto->set_syntax(FileDescriptorLegacy::SyntaxName(syntax)); proto->set_syntax(FileDescriptorLegacy::SyntaxName(syntax));
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
if (syntax == FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS) { if (syntax == FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS) {
proto->set_edition(edition()); proto->set_edition(edition());
} }
#endif // !PROTOBUF_FUTURE_EDITIONS
if (&options() != &FileOptions::default_instance()) { if (&options() != &FileOptions::default_instance()) {
*proto->mutable_options() = options(); *proto->mutable_options() = options();
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
RestoreFeaturesToOptions(proto_features_, proto); RestoreFeaturesToOptions(proto_features_, proto);
#endif // PROTOBUF_FUTURE_EDITIONS
} }
void FileDescriptor::CopyJsonNameTo(FileDescriptorProto* proto) const { void FileDescriptor::CopyJsonNameTo(FileDescriptorProto* proto) const {
@ -2895,9 +2869,7 @@ void Descriptor::CopyTo(DescriptorProto* proto) const {
proto->mutable_options()->CopyFrom(options()); proto->mutable_options()->CopyFrom(options());
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
RestoreFeaturesToOptions(proto_features_, proto); RestoreFeaturesToOptions(proto_features_, proto);
#endif // PROTOBUF_FUTURE_EDITIONS
} }
void Descriptor::CopyJsonNameTo(DescriptorProto* proto) const { void Descriptor::CopyJsonNameTo(DescriptorProto* proto) const {
@ -2929,7 +2901,6 @@ void FieldDescriptor::CopyTo(FieldDescriptorProto* proto) const {
} }
// Some compilers do not allow static_cast directly between two enum types, // Some compilers do not allow static_cast directly between two enum types,
// so we must cast to int first. // so we must cast to int first.
#ifdef PROTOBUF_FUTURE_EDITIONS
if (is_required() && FileDescriptorLegacy(file()).syntax() == if (is_required() && FileDescriptorLegacy(file()).syntax() ==
FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS) { FileDescriptorLegacy::Syntax::SYNTAX_EDITIONS) {
// Editions files have no required keyword, and we only set this label // Editions files have no required keyword, and we only set this label
@ -2951,12 +2922,6 @@ void FieldDescriptor::CopyTo(FieldDescriptorProto* proto) const {
proto->set_type(static_cast<FieldDescriptorProto::Type>( proto->set_type(static_cast<FieldDescriptorProto::Type>(
absl::implicit_cast<int>(type()))); absl::implicit_cast<int>(type())));
} }
#else // PROTOBUF_FUTURE_EDITIONS
proto->set_label(static_cast<FieldDescriptorProto::Label>(
absl::implicit_cast<int>(label())));
proto->set_type(static_cast<FieldDescriptorProto::Type>(
absl::implicit_cast<int>(type())));
#endif // PROTOBUF_FUTURE_EDITIONS
if (is_extension()) { if (is_extension()) {
if (!containing_type()->is_unqualified_placeholder_) { if (!containing_type()->is_unqualified_placeholder_) {
@ -2995,9 +2960,7 @@ void FieldDescriptor::CopyTo(FieldDescriptorProto* proto) const {
proto->mutable_options()->CopyFrom(options()); proto->mutable_options()->CopyFrom(options());
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
RestoreFeaturesToOptions(proto_features_, proto); RestoreFeaturesToOptions(proto_features_, proto);
#endif // PROTOBUF_FUTURE_EDITIONS
} }
void FieldDescriptor::CopyJsonNameTo(FieldDescriptorProto* proto) const { void FieldDescriptor::CopyJsonNameTo(FieldDescriptorProto* proto) const {
@ -3009,9 +2972,7 @@ void OneofDescriptor::CopyTo(OneofDescriptorProto* proto) const {
if (&options() != &OneofOptions::default_instance()) { if (&options() != &OneofOptions::default_instance()) {
proto->mutable_options()->CopyFrom(options()); proto->mutable_options()->CopyFrom(options());
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
RestoreFeaturesToOptions(proto_features_, proto); RestoreFeaturesToOptions(proto_features_, proto);
#endif // PROTOBUF_FUTURE_EDITIONS
} }
void EnumDescriptor::CopyTo(EnumDescriptorProto* proto) const { void EnumDescriptor::CopyTo(EnumDescriptorProto* proto) const {
@ -3032,9 +2993,7 @@ void EnumDescriptor::CopyTo(EnumDescriptorProto* proto) const {
if (&options() != &EnumOptions::default_instance()) { if (&options() != &EnumOptions::default_instance()) {
proto->mutable_options()->CopyFrom(options()); proto->mutable_options()->CopyFrom(options());
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
RestoreFeaturesToOptions(proto_features_, proto); RestoreFeaturesToOptions(proto_features_, proto);
#endif // PROTOBUF_FUTURE_EDITIONS
} }
void EnumValueDescriptor::CopyTo(EnumValueDescriptorProto* proto) const { void EnumValueDescriptor::CopyTo(EnumValueDescriptorProto* proto) const {
@ -3044,9 +3003,7 @@ void EnumValueDescriptor::CopyTo(EnumValueDescriptorProto* proto) const {
if (&options() != &EnumValueOptions::default_instance()) { if (&options() != &EnumValueOptions::default_instance()) {
proto->mutable_options()->CopyFrom(options()); proto->mutable_options()->CopyFrom(options());
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
RestoreFeaturesToOptions(proto_features_, proto); RestoreFeaturesToOptions(proto_features_, proto);
#endif // PROTOBUF_FUTURE_EDITIONS
} }
void ServiceDescriptor::CopyTo(ServiceDescriptorProto* proto) const { void ServiceDescriptor::CopyTo(ServiceDescriptorProto* proto) const {
@ -3059,9 +3016,7 @@ void ServiceDescriptor::CopyTo(ServiceDescriptorProto* proto) const {
if (&options() != &ServiceOptions::default_instance()) { if (&options() != &ServiceOptions::default_instance()) {
proto->mutable_options()->CopyFrom(options()); proto->mutable_options()->CopyFrom(options());
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
RestoreFeaturesToOptions(proto_features_, proto); RestoreFeaturesToOptions(proto_features_, proto);
#endif // PROTOBUF_FUTURE_EDITIONS
} }
void MethodDescriptor::CopyTo(MethodDescriptorProto* proto) const { void MethodDescriptor::CopyTo(MethodDescriptorProto* proto) const {
@ -3087,9 +3042,7 @@ void MethodDescriptor::CopyTo(MethodDescriptorProto* proto) const {
if (server_streaming_) { if (server_streaming_) {
proto->set_server_streaming(true); proto->set_server_streaming(true);
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
RestoreFeaturesToOptions(proto_features_, proto); RestoreFeaturesToOptions(proto_features_, proto);
#endif // PROTOBUF_FUTURE_EDITIONS
} }
// DebugString methods =============================================== // DebugString methods ===============================================
@ -3097,23 +3050,19 @@ void MethodDescriptor::CopyTo(MethodDescriptorProto* proto) const {
namespace { namespace {
bool IsGroupSyntax(const FieldDescriptor* desc) { bool IsGroupSyntax(const FieldDescriptor* desc) {
#ifdef PROTOBUF_FUTURE_EDITIONS
if (FileDescriptorLegacy(desc->file()).syntax() == if (FileDescriptorLegacy(desc->file()).syntax() ==
FileDescriptorLegacy::SYNTAX_EDITIONS) { FileDescriptorLegacy::SYNTAX_EDITIONS) {
return false; return false;
} }
#endif // PROTOBUF_FUTURE_EDITIONS
return desc->type() == FieldDescriptor::TYPE_GROUP; return desc->type() == FieldDescriptor::TYPE_GROUP;
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
template <typename OptionsT> template <typename OptionsT>
void CopyFeaturesToOptions(const FeatureSet* features, OptionsT* options) { void CopyFeaturesToOptions(const FeatureSet* features, OptionsT* options) {
if (features != &FeatureSet::default_instance()) { if (features != &FeatureSet::default_instance()) {
*options->mutable_features() = *features; *options->mutable_features() = *features;
} }
} }
#endif // PROTOBUF_FUTURE_EDITIONS
bool RetrieveOptionsAssumingRightPool( bool RetrieveOptionsAssumingRightPool(
int depth, const Message& options, int depth, const Message& options,
@ -3295,12 +3244,10 @@ std::string FileDescriptor::DebugStringWithOptions(
SourceLocationCommentPrinter syntax_comment(this, path, "", SourceLocationCommentPrinter syntax_comment(this, path, "",
debug_string_options); debug_string_options);
syntax_comment.AddPreComment(&contents); syntax_comment.AddPreComment(&contents);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (FileDescriptorLegacy(this).syntax() == if (FileDescriptorLegacy(this).syntax() ==
FileDescriptorLegacy::SYNTAX_EDITIONS) { FileDescriptorLegacy::SYNTAX_EDITIONS) {
absl::SubstituteAndAppend(&contents, "edition = \"$0\";\n\n", edition()); absl::SubstituteAndAppend(&contents, "edition = \"$0\";\n\n", edition());
} else // NOLINT(readability/braces) } else // NOLINT(readability/braces)
#endif // PROTOBUF_FUTURE_EDITIONS
{ {
absl::SubstituteAndAppend(&contents, "syntax = \"$0\";\n\n", absl::SubstituteAndAppend(&contents, "syntax = \"$0\";\n\n",
FileDescriptorLegacy::SyntaxName( FileDescriptorLegacy::SyntaxName(
@ -3341,9 +3288,7 @@ std::string FileDescriptor::DebugStringWithOptions(
} }
FileOptions full_options = options(); FileOptions full_options = options();
#ifdef PROTOBUF_FUTURE_EDITIONS
CopyFeaturesToOptions(proto_features_, &full_options); CopyFeaturesToOptions(proto_features_, &full_options);
#endif // PROTOBUF_FUTURE_EDITIONS
if (FormatLineOptions(0, full_options, pool(), &contents)) { if (FormatLineOptions(0, full_options, pool(), &contents)) {
contents.append("\n"); // add some space if we had options contents.append("\n"); // add some space if we had options
} }
@ -3424,9 +3369,7 @@ void Descriptor::DebugString(int depth, std::string* contents,
contents->append(" {\n"); contents->append(" {\n");
MessageOptions full_options = options(); MessageOptions full_options = options();
#ifdef PROTOBUF_FUTURE_EDITIONS
CopyFeaturesToOptions(proto_features_, &full_options); CopyFeaturesToOptions(proto_features_, &full_options);
#endif // PROTOBUF_FUTURE_EDITIONS
FormatLineOptions(depth, full_options, file()->pool(), contents); FormatLineOptions(depth, full_options, file()->pool(), contents);
// Find all the 'group' types for fields and extensions; we will not output // Find all the 'group' types for fields and extensions; we will not output
@ -3472,9 +3415,7 @@ void Descriptor::DebugString(int depth, std::string* contents,
extension_range(i)->end_number() - 1); extension_range(i)->end_number() - 1);
} }
ExtensionRangeOptions range_options = extension_range(i)->options(); ExtensionRangeOptions range_options = extension_range(i)->options();
#ifdef PROTOBUF_FUTURE_EDITIONS
CopyFeaturesToOptions(extension_range(i)->proto_features_, &range_options); CopyFeaturesToOptions(extension_range(i)->proto_features_, &range_options);
#endif // PROTOBUF_FUTURE_EDITIONS
std::string formatted_options; std::string formatted_options;
if (FormatBracketedOptions(depth, range_options, file()->pool(), if (FormatBracketedOptions(depth, range_options, file()->pool(),
&formatted_options)) { &formatted_options)) {
@ -3586,14 +3527,12 @@ void FieldDescriptor::DebugString(
(is_optional() && !FieldDescriptorLegacy(this).has_optional_keyword())) { (is_optional() && !FieldDescriptorLegacy(this).has_optional_keyword())) {
label.clear(); label.clear();
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
// Label is omitted for optional and required fields under editions. // Label is omitted for optional and required fields under editions.
if ((is_optional() || is_required()) && if ((is_optional() || is_required()) &&
FileDescriptorLegacy(file()).syntax() == FileDescriptorLegacy(file()).syntax() ==
FileDescriptorLegacy::SYNTAX_EDITIONS) { FileDescriptorLegacy::SYNTAX_EDITIONS) {
label.clear(); label.clear();
} }
#endif // PROTOBUF_FUTURE_EDITIONS
SourceLocationCommentPrinter comment_printer(this, prefix, SourceLocationCommentPrinter comment_printer(this, prefix,
debug_string_options); debug_string_options);
@ -3622,9 +3561,7 @@ void FieldDescriptor::DebugString(
} }
FieldOptions full_options = options(); FieldOptions full_options = options();
#ifdef PROTOBUF_FUTURE_EDITIONS
CopyFeaturesToOptions(proto_features_, &full_options); CopyFeaturesToOptions(proto_features_, &full_options);
#endif // PROTOBUF_FUTURE_EDITIONS
std::string formatted_options; std::string formatted_options;
if (FormatBracketedOptions(depth, full_options, file()->pool(), if (FormatBracketedOptions(depth, full_options, file()->pool(),
&formatted_options)) { &formatted_options)) {
@ -3674,9 +3611,7 @@ void OneofDescriptor::DebugString(
absl::SubstituteAndAppend(contents, "$0oneof $1 {", prefix, name()); absl::SubstituteAndAppend(contents, "$0oneof $1 {", prefix, name());
OneofOptions full_options = options(); OneofOptions full_options = options();
#ifdef PROTOBUF_FUTURE_EDITIONS
CopyFeaturesToOptions(proto_features_, &full_options); CopyFeaturesToOptions(proto_features_, &full_options);
#endif // PROTOBUF_FUTURE_EDITIONS
FormatLineOptions(depth, full_options, containing_type()->file()->pool(), FormatLineOptions(depth, full_options, containing_type()->file()->pool(),
contents); contents);
@ -3717,9 +3652,7 @@ void EnumDescriptor::DebugString(
absl::SubstituteAndAppend(contents, "$0enum $1 {\n", prefix, name()); absl::SubstituteAndAppend(contents, "$0enum $1 {\n", prefix, name());
EnumOptions full_options = options(); EnumOptions full_options = options();
#ifdef PROTOBUF_FUTURE_EDITIONS
CopyFeaturesToOptions(proto_features_, &full_options); CopyFeaturesToOptions(proto_features_, &full_options);
#endif // PROTOBUF_FUTURE_EDITIONS
FormatLineOptions(depth, full_options, file()->pool(), contents); FormatLineOptions(depth, full_options, file()->pool(), contents);
for (int i = 0; i < value_count(); i++) { for (int i = 0; i < value_count(); i++) {
@ -3780,9 +3713,7 @@ void EnumValueDescriptor::DebugString(
absl::SubstituteAndAppend(contents, "$0$1 = $2", prefix, name(), number()); absl::SubstituteAndAppend(contents, "$0$1 = $2", prefix, name(), number());
EnumValueOptions full_options = options(); EnumValueOptions full_options = options();
#ifdef PROTOBUF_FUTURE_EDITIONS
CopyFeaturesToOptions(proto_features_, &full_options); CopyFeaturesToOptions(proto_features_, &full_options);
#endif // PROTOBUF_FUTURE_EDITIONS
std::string formatted_options; std::string formatted_options;
if (FormatBracketedOptions(depth, full_options, type()->file()->pool(), if (FormatBracketedOptions(depth, full_options, type()->file()->pool(),
&formatted_options)) { &formatted_options)) {
@ -3815,9 +3746,7 @@ void ServiceDescriptor::DebugString(
absl::SubstituteAndAppend(contents, "service $0 {\n", name()); absl::SubstituteAndAppend(contents, "service $0 {\n", name());
ServiceOptions full_options = options(); ServiceOptions full_options = options();
#ifdef PROTOBUF_FUTURE_EDITIONS
CopyFeaturesToOptions(proto_features_, &full_options); CopyFeaturesToOptions(proto_features_, &full_options);
#endif // PROTOBUF_FUTURE_EDITIONS
FormatLineOptions(1, full_options, file()->pool(), contents); FormatLineOptions(1, full_options, file()->pool(), contents);
for (int i = 0; i < method_count(); i++) { for (int i = 0; i < method_count(); i++) {
@ -3857,9 +3786,7 @@ void MethodDescriptor::DebugString(
client_streaming() ? "stream " : "", server_streaming() ? "stream " : ""); client_streaming() ? "stream " : "", server_streaming() ? "stream " : "");
MethodOptions full_options = options(); MethodOptions full_options = options();
#ifdef PROTOBUF_FUTURE_EDITIONS
CopyFeaturesToOptions(proto_features_, &full_options); CopyFeaturesToOptions(proto_features_, &full_options);
#endif // PROTOBUF_FUTURE_EDITIONS
std::string formatted_options; std::string formatted_options;
if (FormatLineOptions(depth, full_options, service()->file()->pool(), if (FormatLineOptions(depth, full_options, service()->file()->pool(),
&formatted_options)) { &formatted_options)) {
@ -3875,23 +3802,12 @@ void MethodDescriptor::DebugString(
// Feature methods =============================================== // Feature methods ===============================================
bool EnumDescriptor::is_closed() const { bool EnumDescriptor::is_closed() const {
#ifdef PROTOBUF_FUTURE_EDITIONS
return features().enum_type() == FeatureSet::CLOSED; return features().enum_type() == FeatureSet::CLOSED;
#else // PROTOBUF_FUTURE_EDITIONS
PROTOBUF_IGNORE_DEPRECATION_START
return file()->syntax() != FileDescriptor::SYNTAX_PROTO3;
PROTOBUF_IGNORE_DEPRECATION_STOP
#endif // PROTOBUF_FUTURE_EDITIONS
} }
bool FieldDescriptor::is_packed() const { bool FieldDescriptor::is_packed() const {
if (!is_packable()) return false; if (!is_packable()) return false;
#ifdef PROTOBUF_FUTURE_EDITIONS
if (features().repeated_field_encoding() != FeatureSet::PACKED) { if (features().repeated_field_encoding() != FeatureSet::PACKED) {
#else // PROTOBUF_FUTURE_EDITIONS
if (FileDescriptorLegacy(file_).syntax() ==
FileDescriptorLegacy::Syntax::SYNTAX_PROTO2) {
#endif // PROTOBUF_FUTURE_EDITIONS
return (options_ != nullptr) && options_->packed(); return (options_ != nullptr) && options_->packed();
} else { } else {
return options_ == nullptr || !options_->has_packed() || options_->packed(); return options_ == nullptr || !options_->has_packed() || options_->packed();
@ -3899,13 +3815,8 @@ bool FieldDescriptor::is_packed() const {
} }
static bool IsStrictUtf8(const FieldDescriptor* field) { static bool IsStrictUtf8(const FieldDescriptor* field) {
#ifdef PROTOBUF_FUTURE_EDITIONS
return internal::InternalFeatureHelper::GetFeatures(*field) return internal::InternalFeatureHelper::GetFeatures(*field)
.string_field_validation() == FeatureSet::MANDATORY; .string_field_validation() == FeatureSet::MANDATORY;
#else // PROTOBUF_FUTURE_EDITIONS
return FileDescriptorLegacy(field->file()).syntax() ==
FileDescriptorLegacy::Syntax::SYNTAX_PROTO3;
#endif // PROTOBUF_FUTURE_EDITIONS
} }
bool FieldDescriptor::requires_utf8_validation() const { bool FieldDescriptor::requires_utf8_validation() const {
@ -3915,25 +3826,17 @@ bool FieldDescriptor::requires_utf8_validation() const {
bool FieldDescriptor::has_presence() const { bool FieldDescriptor::has_presence() const {
if (is_repeated()) return false; if (is_repeated()) return false;
return cpp_type() == CPPTYPE_MESSAGE || containing_oneof() || return cpp_type() == CPPTYPE_MESSAGE || containing_oneof() ||
#ifdef PROTOBUF_FUTURE_EDITIONS
features().field_presence() != FeatureSet::IMPLICIT; features().field_presence() != FeatureSet::IMPLICIT;
#else // PROTOBUF_FUTURE_EDITIONS
FileDescriptorLegacy(file_).syntax() ==
FileDescriptorLegacy::Syntax::SYNTAX_PROTO2;
#endif // PROTOBUF_FUTURE_EDITIONS
} }
bool FieldDescriptor::legacy_enum_field_treated_as_closed() const { bool FieldDescriptor::legacy_enum_field_treated_as_closed() const {
#ifdef PROTOBUF_FUTURE_EDITIONS
return type() == TYPE_ENUM && return type() == TYPE_ENUM &&
(features().GetExtension(pb::cpp).legacy_closed_enum() || (features().GetExtension(pb::cpp).legacy_closed_enum() ||
enum_type()->is_closed()); enum_type()->is_closed());
#else // PROTOBUF_FUTURE_EDITIONS
return type() == TYPE_ENUM && return type() == TYPE_ENUM &&
(FileDescriptorLegacy(file_).syntax() == (FileDescriptorLegacy(file_).syntax() ==
FileDescriptorLegacy::Syntax::SYNTAX_PROTO2 || FileDescriptorLegacy::Syntax::SYNTAX_PROTO2 ||
enum_type()->is_closed()); enum_type()->is_closed());
#endif // PROTOBUF_FUTURE_EDITIONS
} }
// Location methods =============================================== // Location methods ===============================================
@ -4134,9 +4037,7 @@ class DescriptorBuilder {
DescriptorPool::Tables* tables_; // for convenience DescriptorPool::Tables* tables_; // for convenience
DescriptorPool::ErrorCollector* error_collector_; DescriptorPool::ErrorCollector* error_collector_;
#ifdef PROTOBUF_FUTURE_EDITIONS
absl::optional<FeatureResolver> feature_resolver_ = absl::nullopt; absl::optional<FeatureResolver> feature_resolver_ = absl::nullopt;
#endif // PROTOBUF_FUTURE_EDITIONS
// As we build descriptors we store copies of the options messages in // As we build descriptors we store copies of the options messages in
// them. We put pointers to those copies in this vector, as we build, so we // them. We put pointers to those copies in this vector, as we build, so we
@ -4331,7 +4232,6 @@ class DescriptorBuilder {
absl::Span<const int> options_path, absl::string_view option_name, absl::Span<const int> options_path, absl::string_view option_name,
internal::FlatAllocator& alloc); internal::FlatAllocator& alloc);
#ifdef PROTOBUF_FUTURE_EDITIONS
// Allocates and resolves any feature sets that need to be owned by a given // Allocates and resolves any feature sets that need to be owned by a given
// descriptor. This also strips features out of the mutable options message to // descriptor. This also strips features out of the mutable options message to
// prevent leaking of unresolved features. // prevent leaking of unresolved features.
@ -4361,7 +4261,6 @@ class DescriptorBuilder {
const DescriptorT* descriptor); const DescriptorT* descriptor);
void PostProcessFieldFeatures(FieldDescriptor& field); void PostProcessFieldFeatures(FieldDescriptor& field);
#endif // PROTOBUF_FUTURE_EDITIONS
// Allocates an array of two strings, the first one is a copy of // Allocates an array of two strings, the first one is a copy of
// `proto_name`, and the second one is the full name. Full proto name is // `proto_name`, and the second one is the full name. Full proto name is
@ -4469,13 +4368,11 @@ class DescriptorBuilder {
// Otherwise returns true. // Otherwise returns true.
bool InterpretOptions(OptionsToInterpret* options_to_interpret); bool InterpretOptions(OptionsToInterpret* options_to_interpret);
#ifdef PROTOBUF_FUTURE_EDITIONS
// Interprets the uninterpreted feature options in the specified Options // Interprets the uninterpreted feature options in the specified Options
// message. On error, calls AddError() on the underlying builder and returns // message. On error, calls AddError() on the underlying builder and returns
// false. Otherwise returns true. // false. Otherwise returns true.
bool InterpretFeatures(OptionsToInterpret* options_to_interpret); bool InterpretFeatures(OptionsToInterpret* options_to_interpret);
#endif // PROTOBUF_FUTURE_EDITIONS
// Updates the given source code info by re-writing uninterpreted option // Updates the given source code info by re-writing uninterpreted option
// locations to refer to the corresponding interpreted option. // locations to refer to the corresponding interpreted option.
void UpdateSourceCodeInfo(SourceCodeInfo* info); void UpdateSourceCodeInfo(SourceCodeInfo* info);
@ -4721,14 +4618,12 @@ DescriptorBuilder::DescriptorBuilder(
had_errors_(false), had_errors_(false),
possible_undeclared_dependency_(nullptr), possible_undeclared_dependency_(nullptr),
undefine_resolved_name_("") { undefine_resolved_name_("") {
#ifdef PROTOBUF_FUTURE_EDITIONS
// Ensure that any lazily loaded static initializers from the generated pool // Ensure that any lazily loaded static initializers from the generated pool
// (e.g. from bootstrapped protos) are run before building any descriptors. We // (e.g. from bootstrapped protos) are run before building any descriptors. We
// have to avoid registering these pre-main, because we need to ensure that // have to avoid registering these pre-main, because we need to ensure that
// the linker --gc-sections step can strip out the full runtime if it is // the linker --gc-sections step can strip out the full runtime if it is
// unused. // unused.
pb::cpp.LazyRegister(); pb::cpp.LazyRegister();
#endif // PROTOBUF_FUTURE_EDITIONS
} }
DescriptorBuilder::~DescriptorBuilder() {} DescriptorBuilder::~DescriptorBuilder() {}
@ -5080,10 +4975,8 @@ Symbol DescriptorPool::NewPlaceholderWithMutexHeld(
alloc.AllocateStrings(placeholder_name, placeholder_full_name); alloc.AllocateStrings(placeholder_name, placeholder_full_name);
placeholder_enum->file_ = placeholder_file; placeholder_enum->file_ = placeholder_file;
placeholder_enum->options_ = &EnumOptions::default_instance(); placeholder_enum->options_ = &EnumOptions::default_instance();
#ifdef PROTOBUF_FUTURE_EDITIONS
placeholder_enum->proto_features_ = &FeatureSet::default_instance(); placeholder_enum->proto_features_ = &FeatureSet::default_instance();
placeholder_enum->merged_features_ = &FeatureSet::default_instance(); placeholder_enum->merged_features_ = &FeatureSet::default_instance();
#endif // PROTOBUF_FUTURE_EDITIONS
placeholder_enum->is_placeholder_ = true; placeholder_enum->is_placeholder_ = true;
placeholder_enum->is_unqualified_placeholder_ = (name[0] != '.'); placeholder_enum->is_unqualified_placeholder_ = (name[0] != '.');
@ -5121,10 +5014,8 @@ Symbol DescriptorPool::NewPlaceholderWithMutexHeld(
alloc.AllocateStrings(placeholder_name, placeholder_full_name); alloc.AllocateStrings(placeholder_name, placeholder_full_name);
placeholder_message->file_ = placeholder_file; placeholder_message->file_ = placeholder_file;
placeholder_message->options_ = &MessageOptions::default_instance(); placeholder_message->options_ = &MessageOptions::default_instance();
#ifdef PROTOBUF_FUTURE_EDITIONS
placeholder_message->proto_features_ = &FeatureSet::default_instance(); placeholder_message->proto_features_ = &FeatureSet::default_instance();
placeholder_message->merged_features_ = &FeatureSet::default_instance(); placeholder_message->merged_features_ = &FeatureSet::default_instance();
#endif // PROTOBUF_FUTURE_EDITIONS
placeholder_message->is_placeholder_ = true; placeholder_message->is_placeholder_ = true;
placeholder_message->is_unqualified_placeholder_ = (name[0] != '.'); placeholder_message->is_unqualified_placeholder_ = (name[0] != '.');
@ -5137,12 +5028,10 @@ Symbol DescriptorPool::NewPlaceholderWithMutexHeld(
placeholder_message->extension_ranges_[0].end_ = placeholder_message->extension_ranges_[0].end_ =
FieldDescriptor::kMaxNumber + 1; FieldDescriptor::kMaxNumber + 1;
placeholder_message->extension_ranges_[0].options_ = nullptr; placeholder_message->extension_ranges_[0].options_ = nullptr;
#ifdef PROTOBUF_FUTURE_EDITIONS
placeholder_message->extension_ranges_[0].proto_features_ = placeholder_message->extension_ranges_[0].proto_features_ =
&FeatureSet::default_instance(); &FeatureSet::default_instance();
placeholder_message->extension_ranges_[0].merged_features_ = placeholder_message->extension_ranges_[0].merged_features_ =
&FeatureSet::default_instance(); &FeatureSet::default_instance();
#endif // PROTOBUF_FUTURE_EDITIONS
} }
return Symbol(placeholder_message); return Symbol(placeholder_message);
@ -5172,10 +5061,8 @@ FileDescriptor* DescriptorPool::NewPlaceholderFileWithMutexHeld(
placeholder->package_ = &internal::GetEmptyString(); placeholder->package_ = &internal::GetEmptyString();
placeholder->pool_ = this; placeholder->pool_ = this;
placeholder->options_ = &FileOptions::default_instance(); placeholder->options_ = &FileOptions::default_instance();
#ifdef PROTOBUF_FUTURE_EDITIONS
placeholder->proto_features_ = &FeatureSet::default_instance(); placeholder->proto_features_ = &FeatureSet::default_instance();
placeholder->merged_features_ = &FeatureSet::default_instance(); placeholder->merged_features_ = &FeatureSet::default_instance();
#endif // PROTOBUF_FUTURE_EDITIONS
placeholder->tables_ = &FileDescriptorTables::GetEmptyInstance(); placeholder->tables_ = &FileDescriptorTables::GetEmptyInstance();
placeholder->source_code_info_ = &SourceCodeInfo::default_instance(); placeholder->source_code_info_ = &SourceCodeInfo::default_instance();
placeholder->is_placeholder_ = true; placeholder->is_placeholder_ = true;
@ -5322,10 +5209,8 @@ void DescriptorBuilder::AllocateOptions(
descriptor->full_name(), descriptor->full_name(), proto, options_path, descriptor->full_name(), descriptor->full_name(), proto, options_path,
option_name, alloc); option_name, alloc);
descriptor->options_ = options; descriptor->options_ = options;
#ifdef PROTOBUF_FUTURE_EDITIONS
descriptor->proto_features_ = &FeatureSet::default_instance(); descriptor->proto_features_ = &FeatureSet::default_instance();
descriptor->merged_features_ = &FeatureSet::default_instance(); descriptor->merged_features_ = &FeatureSet::default_instance();
#endif // PROTOBUF_FUTURE_EDITIONS
} }
// We specialize for FileDescriptor. // We specialize for FileDescriptor.
@ -5339,10 +5224,8 @@ void DescriptorBuilder::AllocateOptions(const FileDescriptorProto& proto,
absl::StrCat(descriptor->package(), ".dummy"), descriptor->name(), proto, absl::StrCat(descriptor->package(), ".dummy"), descriptor->name(), proto,
options_path, "google.protobuf.FileOptions", alloc); options_path, "google.protobuf.FileOptions", alloc);
descriptor->options_ = options; descriptor->options_ = options;
#ifdef PROTOBUF_FUTURE_EDITIONS
descriptor->proto_features_ = &FeatureSet::default_instance(); descriptor->proto_features_ = &FeatureSet::default_instance();
descriptor->merged_features_ = &FeatureSet::default_instance(); descriptor->merged_features_ = &FeatureSet::default_instance();
#endif // PROTOBUF_FUTURE_EDITIONS
} }
template <class DescriptorT> template <class DescriptorT>
@ -5405,7 +5288,6 @@ typename DescriptorT::OptionsType* DescriptorBuilder::AllocateOptionsImpl(
return options; return options;
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
template <class DescriptorT> template <class DescriptorT>
void DescriptorBuilder::ResolveFeaturesImpl( void DescriptorBuilder::ResolveFeaturesImpl(
const typename DescriptorT::Proto& proto, DescriptorT* descriptor, const typename DescriptorT::Proto& proto, DescriptorT* descriptor,
@ -5510,8 +5392,6 @@ void DescriptorBuilder::PostProcessFieldFeatures(FieldDescriptor& field) {
} }
} }
#endif // PROTOBUF_FUTURE_EDITIONS
// A common pattern: We want to convert a repeated field in the descriptor // A common pattern: We want to convert a repeated field in the descriptor
// to an array of values, calling some method to build each value. // to an array of values, calling some method to build each value.
#define BUILD_ARRAY(INPUT, OUTPUT, NAME, METHOD, PARENT) \ #define BUILD_ARRAY(INPUT, OUTPUT, NAME, METHOD, PARENT) \
@ -5595,9 +5475,7 @@ static void PlanAllocationSize(
alloc.PlanArray<std::string>(2 * values.size()); // name + full_name alloc.PlanArray<std::string>(2 * values.size()); // name + full_name
for (const auto& v : values) { for (const auto& v : values) {
if (v.has_options()) alloc.PlanArray<EnumValueOptions>(1); if (v.has_options()) alloc.PlanArray<EnumValueOptions>(1);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (HasFeatures(v.options())) alloc.PlanArray<FeatureSet>(2); if (HasFeatures(v.options())) alloc.PlanArray<FeatureSet>(2);
#endif // !PROTOBUF_FUTURE_EDITIONS
} }
} }
@ -5608,9 +5486,7 @@ static void PlanAllocationSize(
alloc.PlanArray<std::string>(2 * enums.size()); // name + full_name alloc.PlanArray<std::string>(2 * enums.size()); // name + full_name
for (const auto& e : enums) { for (const auto& e : enums) {
if (e.has_options()) alloc.PlanArray<EnumOptions>(1); if (e.has_options()) alloc.PlanArray<EnumOptions>(1);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (HasFeatures(e.options())) alloc.PlanArray<FeatureSet>(2); if (HasFeatures(e.options())) alloc.PlanArray<FeatureSet>(2);
#endif // !PROTOBUF_FUTURE_EDITIONS
PlanAllocationSize(e.value(), alloc); PlanAllocationSize(e.value(), alloc);
alloc.PlanArray<EnumDescriptor::ReservedRange>(e.reserved_range_size()); alloc.PlanArray<EnumDescriptor::ReservedRange>(e.reserved_range_size());
alloc.PlanArray<const std::string*>(e.reserved_name_size()); alloc.PlanArray<const std::string*>(e.reserved_name_size());
@ -5625,9 +5501,7 @@ static void PlanAllocationSize(
alloc.PlanArray<std::string>(2 * oneofs.size()); // name + full_name alloc.PlanArray<std::string>(2 * oneofs.size()); // name + full_name
for (const auto& oneof : oneofs) { for (const auto& oneof : oneofs) {
if (oneof.has_options()) alloc.PlanArray<OneofOptions>(1); if (oneof.has_options()) alloc.PlanArray<OneofOptions>(1);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (HasFeatures(oneof.options())) alloc.PlanArray<FeatureSet>(2); if (HasFeatures(oneof.options())) alloc.PlanArray<FeatureSet>(2);
#endif // !PROTOBUF_FUTURE_EDITIONS
} }
} }
@ -5637,9 +5511,7 @@ static void PlanAllocationSize(
alloc.PlanArray<FieldDescriptor>(fields.size()); alloc.PlanArray<FieldDescriptor>(fields.size());
for (const auto& field : fields) { for (const auto& field : fields) {
if (field.has_options()) alloc.PlanArray<FieldOptions>(1); if (field.has_options()) alloc.PlanArray<FieldOptions>(1);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (HasFeatures(field.options())) alloc.PlanArray<FeatureSet>(2); if (HasFeatures(field.options())) alloc.PlanArray<FeatureSet>(2);
#endif // !PROTOBUF_FUTURE_EDITIONS
alloc.PlanFieldNames(field.name(), alloc.PlanFieldNames(field.name(),
field.has_json_name() ? &field.json_name() : nullptr); field.has_json_name() ? &field.json_name() : nullptr);
if (field.has_default_value() && field.has_type() && if (field.has_default_value() && field.has_type() &&
@ -5657,9 +5529,7 @@ static void PlanAllocationSize(
alloc.PlanArray<Descriptor::ExtensionRange>(ranges.size()); alloc.PlanArray<Descriptor::ExtensionRange>(ranges.size());
for (const auto& r : ranges) { for (const auto& r : ranges) {
if (r.has_options()) alloc.PlanArray<ExtensionRangeOptions>(1); if (r.has_options()) alloc.PlanArray<ExtensionRangeOptions>(1);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (HasFeatures(r.options())) alloc.PlanArray<FeatureSet>(2); if (HasFeatures(r.options())) alloc.PlanArray<FeatureSet>(2);
#endif // !PROTOBUF_FUTURE_EDITIONS
} }
} }
@ -5671,9 +5541,7 @@ static void PlanAllocationSize(
for (const auto& message : messages) { for (const auto& message : messages) {
if (message.has_options()) alloc.PlanArray<MessageOptions>(1); if (message.has_options()) alloc.PlanArray<MessageOptions>(1);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (HasFeatures(message.options())) alloc.PlanArray<FeatureSet>(2); if (HasFeatures(message.options())) alloc.PlanArray<FeatureSet>(2);
#endif // !PROTOBUF_FUTURE_EDITIONS
PlanAllocationSize(message.nested_type(), alloc); PlanAllocationSize(message.nested_type(), alloc);
PlanAllocationSize(message.field(), alloc); PlanAllocationSize(message.field(), alloc);
PlanAllocationSize(message.extension(), alloc); PlanAllocationSize(message.extension(), alloc);
@ -5693,9 +5561,7 @@ static void PlanAllocationSize(
alloc.PlanArray<std::string>(2 * methods.size()); // name + full_name alloc.PlanArray<std::string>(2 * methods.size()); // name + full_name
for (const auto& m : methods) { for (const auto& m : methods) {
if (m.has_options()) alloc.PlanArray<MethodOptions>(1); if (m.has_options()) alloc.PlanArray<MethodOptions>(1);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (HasFeatures(m.options())) alloc.PlanArray<FeatureSet>(2); if (HasFeatures(m.options())) alloc.PlanArray<FeatureSet>(2);
#endif // !PROTOBUF_FUTURE_EDITIONS
} }
} }
@ -5706,9 +5572,7 @@ static void PlanAllocationSize(
alloc.PlanArray<std::string>(2 * services.size()); // name + full_name alloc.PlanArray<std::string>(2 * services.size()); // name + full_name
for (const auto& service : services) { for (const auto& service : services) {
if (service.has_options()) alloc.PlanArray<ServiceOptions>(1); if (service.has_options()) alloc.PlanArray<ServiceOptions>(1);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (HasFeatures(service.options())) alloc.PlanArray<FeatureSet>(2); if (HasFeatures(service.options())) alloc.PlanArray<FeatureSet>(2);
#endif // !PROTOBUF_FUTURE_EDITIONS
PlanAllocationSize(service.method(), alloc); PlanAllocationSize(service.method(), alloc);
} }
} }
@ -5717,20 +5581,15 @@ static void PlanAllocationSize(const FileDescriptorProto& proto,
internal::FlatAllocator& alloc) { internal::FlatAllocator& alloc) {
alloc.PlanArray<FileDescriptor>(1); alloc.PlanArray<FileDescriptor>(1);
alloc.PlanArray<FileDescriptorTables>(1); alloc.PlanArray<FileDescriptorTables>(1);
alloc.PlanArray<std::string>(2 alloc.PlanArray<std::string>(
#ifdef PROTOBUF_FUTURE_EDITIONS 2 + (proto.has_edition() ? 1 : 0)); // name + package
+ (proto.has_edition() ? 1 : 0)
#endif // !PROTOBUF_FUTURE_EDITIONS
); // name + package
if (proto.has_options()) alloc.PlanArray<FileOptions>(1); if (proto.has_options()) alloc.PlanArray<FileOptions>(1);
#ifdef PROTOBUF_FUTURE_EDITIONS
if (proto.has_edition()) { if (proto.has_edition()) {
alloc.PlanArray<FeatureSet>(1); alloc.PlanArray<FeatureSet>(1);
if (HasFeatures(proto.options())) { if (HasFeatures(proto.options())) {
alloc.PlanArray<FeatureSet>(1); alloc.PlanArray<FeatureSet>(1);
} }
} }
#endif // !PROTOBUF_FUTURE_EDITIONS
if (proto.has_source_code_info()) alloc.PlanArray<SourceCodeInfo>(1); if (proto.has_source_code_info()) alloc.PlanArray<SourceCodeInfo>(1);
PlanAllocationSize(proto.service(), alloc); PlanAllocationSize(proto.service(), alloc);
@ -5832,7 +5691,6 @@ FileDescriptor* DescriptorBuilder::BuildFileImpl(
FileDescriptor* result = alloc.AllocateArray<FileDescriptor>(1); FileDescriptor* result = alloc.AllocateArray<FileDescriptor>(1);
file_ = result; file_ = result;
#ifdef PROTOBUF_FUTURE_EDITIONS
if (proto.has_edition()) { if (proto.has_edition()) {
Symbol symbol = FindSymbolNotEnforcingDeps("google.protobuf.FeatureSet"); Symbol symbol = FindSymbolNotEnforcingDeps("google.protobuf.FeatureSet");
const Descriptor* descriptor = symbol.descriptor(); const Descriptor* descriptor = symbol.descriptor();
@ -5854,7 +5712,6 @@ FileDescriptor* DescriptorBuilder::BuildFileImpl(
feature_resolver_.emplace(std::move(feature_resolver).value()); feature_resolver_.emplace(std::move(feature_resolver).value());
} }
} }
#endif // PROTOBUF_FUTURE_EDITIONS
result->is_placeholder_ = false; result->is_placeholder_ = false;
result->finished_building_ = false; result->finished_building_ = false;
@ -5881,21 +5738,17 @@ FileDescriptor* DescriptorBuilder::BuildFileImpl(
file_->syntax_ = FileDescriptorLegacy::SYNTAX_PROTO2; file_->syntax_ = FileDescriptorLegacy::SYNTAX_PROTO2;
} else if (proto.syntax() == "proto3") { } else if (proto.syntax() == "proto3") {
file_->syntax_ = FileDescriptorLegacy::SYNTAX_PROTO3; file_->syntax_ = FileDescriptorLegacy::SYNTAX_PROTO3;
#ifdef PROTOBUF_FUTURE_EDITIONS
} else if (proto.syntax() == "editions") { } else if (proto.syntax() == "editions") {
file_->syntax_ = FileDescriptorLegacy::SYNTAX_EDITIONS; file_->syntax_ = FileDescriptorLegacy::SYNTAX_EDITIONS;
#endif // !PROTOBUF_FUTURE_EDITIONS
} else { } else {
file_->syntax_ = FileDescriptorLegacy::SYNTAX_UNKNOWN; file_->syntax_ = FileDescriptorLegacy::SYNTAX_UNKNOWN;
AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, [&] { AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, [&] {
return absl::StrCat("Unrecognized syntax: ", proto.syntax()); return absl::StrCat("Unrecognized syntax: ", proto.syntax());
}); });
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
if (proto.has_edition()) { if (proto.has_edition()) {
file_->edition_ = alloc.AllocateStrings(proto.edition()); file_->edition_ = alloc.AllocateStrings(proto.edition());
} }
#endif // !PROTOBUF_FUTURE_EDITIONS
result->name_ = alloc.AllocateStrings(proto.name()); result->name_ = alloc.AllocateStrings(proto.name());
if (proto.has_package()) { if (proto.has_package()) {
@ -5964,7 +5817,6 @@ FileDescriptor* DescriptorBuilder::BuildFileImpl(
return nullptr; return nullptr;
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
// Look for feature extensions in regular imports. // Look for feature extensions in regular imports.
if (feature_resolver_.has_value() && dependency != nullptr) { if (feature_resolver_.has_value() && dependency != nullptr) {
absl::Status status = feature_resolver_->RegisterExtensions(*dependency); absl::Status status = feature_resolver_->RegisterExtensions(*dependency);
@ -5974,7 +5826,6 @@ FileDescriptor* DescriptorBuilder::BuildFileImpl(
[&] { return std::string(status.message()); }); [&] { return std::string(status.message()); });
} }
} }
#endif // PROTOBUF_FUTURE_EDITIONS
if (dependency == nullptr) { if (dependency == nullptr) {
if (!pool_->lazily_build_dependencies_) { if (!pool_->lazily_build_dependencies_) {
@ -6097,7 +5948,6 @@ FileDescriptor* DescriptorBuilder::BuildFileImpl(
SuggestFieldNumbers(result, proto); SuggestFieldNumbers(result, proto);
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
// Interpret only the feature options first. This has to be done in two // Interpret only the feature options first. This has to be done in two
// passes, since options defined in this file may have features attached // passes, since options defined in this file may have features attached
// to them. // to them.
@ -6130,7 +5980,6 @@ FileDescriptor* DescriptorBuilder::BuildFileImpl(
internal::VisitDescriptors(*result, [&](const FieldDescriptor& field) { internal::VisitDescriptors(*result, [&](const FieldDescriptor& field) {
PostProcessFieldFeatures(const_cast<FieldDescriptor&>(field)); PostProcessFieldFeatures(const_cast<FieldDescriptor&>(field));
}); });
#endif // PROTOBUF_FUTURE_EDITIONS
// Interpret any remaining uninterpreted options gathered into // Interpret any remaining uninterpreted options gathered into
// options_to_interpret_ during descriptor building. Cross-linking has made // options_to_interpret_ during descriptor building. Cross-linking has made
@ -6479,15 +6328,11 @@ void DescriptorBuilder::CheckFieldJsonNameUniqueness(
}; };
bool involves_default = !details.is_custom || !match.is_custom; bool involves_default = !details.is_custom || !match.is_custom;
#ifdef PROTOBUF_FUTURE_EDITIONS
if (descriptor->features().json_format() == if (descriptor->features().json_format() ==
FeatureSet::LEGACY_BEST_EFFORT && FeatureSet::LEGACY_BEST_EFFORT &&
involves_default) { involves_default) {
#else // PROTOBUF_FUTURE_EDITIONS // TODO(b/261750676) Upgrade this to an error once downstream protos
if (syntax == FileDescriptorLegacy::SYNTAX_PROTO2 && involves_default) { // have been fixed.
#endif // PROTOBUF_FUTURE_EDITIONS
// TODO(b/261750676) Upgrade this to an error once downstream protos have
// been fixed.
AddWarning(message_name, field, DescriptorPool::ErrorCollector::NAME, AddWarning(message_name, field, DescriptorPool::ErrorCollector::NAME,
make_error); make_error);
} else { } else {
@ -8004,7 +7849,6 @@ static bool IsStringMapType(const FieldDescriptor* field) {
void DescriptorBuilder::ValidateFieldFeatures( void DescriptorBuilder::ValidateFieldFeatures(
const FieldDescriptor* field, const FieldDescriptorProto& proto) { const FieldDescriptor* field, const FieldDescriptorProto& proto) {
#ifdef PROTOBUF_FUTURE_EDITIONS
// Rely on our legacy validation for proto2/proto3 files. // Rely on our legacy validation for proto2/proto3 files.
if (IsLegacyFeatureSet(field->features())) return; if (IsLegacyFeatureSet(field->features())) return;
@ -8060,7 +7904,6 @@ void DescriptorBuilder::ValidateFieldFeatures(
AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::NAME, AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::NAME,
"Only repeated fields can specify `repeated_field_encoding`."); "Only repeated fields can specify `repeated_field_encoding`.");
} }
#endif // PROTOBUF_FUTURE_EDITIONS
} }
void DescriptorBuilder::ValidateOptions(const EnumDescriptor* enm, void DescriptorBuilder::ValidateOptions(const EnumDescriptor* enm,
@ -8459,12 +8302,10 @@ bool DescriptorBuilder::OptionInterpreter::InterpretOptions(
OptionsToInterpret* options_to_interpret) { OptionsToInterpret* options_to_interpret) {
return InterpretOptionsImpl(options_to_interpret, /*features=*/false); return InterpretOptionsImpl(options_to_interpret, /*features=*/false);
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
bool DescriptorBuilder::OptionInterpreter::InterpretFeatures( bool DescriptorBuilder::OptionInterpreter::InterpretFeatures(
OptionsToInterpret* options_to_interpret) { OptionsToInterpret* options_to_interpret) {
return InterpretOptionsImpl(options_to_interpret, /*features=*/true); return InterpretOptionsImpl(options_to_interpret, /*features=*/true);
} }
#endif // PROTOBUF_FUTURE_EDITIONS
bool DescriptorBuilder::OptionInterpreter::InterpretOptionsImpl( bool DescriptorBuilder::OptionInterpreter::InterpretOptionsImpl(
OptionsToInterpret* options_to_interpret, bool features) { OptionsToInterpret* options_to_interpret, bool features) {
// Note that these may be in different pools, so we can't use the same // Note that these may be in different pools, so we can't use the same
@ -9612,12 +9453,10 @@ Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field, bool is_lite) {
} }
bool IsLazilyInitializedFile(absl::string_view filename) { bool IsLazilyInitializedFile(absl::string_view filename) {
#ifdef PROTOBUF_FUTURE_EDITIONS
if (filename == "third_party/protobuf/cpp_features.proto" || if (filename == "third_party/protobuf/cpp_features.proto" ||
filename == "google/protobuf/cpp_features.proto") { filename == "google/protobuf/cpp_features.proto") {
return true; return true;
} }
#endif // PROTOBUF_FUTURE_EDITIONS
return filename == "net/proto2/proto/descriptor.proto" || return filename == "net/proto2/proto/descriptor.proto" ||
filename == "google/protobuf/descriptor.proto"; filename == "google/protobuf/descriptor.proto";
} }
@ -9625,7 +9464,6 @@ bool IsLazilyInitializedFile(absl::string_view filename) {
} // namespace cpp } // namespace cpp
} // namespace internal } // namespace internal
#ifdef PROTOBUF_FUTURE_EDITIONS
absl::string_view FileDescriptor::edition() const { absl::string_view FileDescriptor::edition() const {
// ASLR will help give this a random value across processes. // ASLR will help give this a random value across processes.
static const void* kAntiHyrumText = &kAntiHyrumText; static const void* kAntiHyrumText = &kAntiHyrumText;
@ -9635,7 +9473,6 @@ absl::string_view FileDescriptor::edition() const {
return edition_ == nullptr ? anti_hyrum_string : *edition_; return edition_ == nullptr ? anti_hyrum_string : *edition_;
} }
#endif // !PROTOBUF_FUTURE_EDITIONS
} // namespace protobuf } // namespace protobuf
} // namespace google } // namespace google

@ -258,7 +258,6 @@ class PROTOBUF_EXPORT SymbolBase {
template <int N> template <int N>
class PROTOBUF_EXPORT SymbolBaseN : public SymbolBase {}; class PROTOBUF_EXPORT SymbolBaseN : public SymbolBase {};
#ifdef PROTOBUF_FUTURE_EDITIONS
// This class is for internal use only and provides access to the FeatureSets // This class is for internal use only and provides access to the FeatureSets
// defined on descriptors. These features are not designed to be stable, and // defined on descriptors. These features are not designed to be stable, and
// depending directly on them (vs the public descriptor APIs) is not safe. // depending directly on them (vs the public descriptor APIs) is not safe.
@ -288,7 +287,6 @@ class PROTOBUF_EXPORT InternalFeatureHelper {
// for every descriptor. // for every descriptor.
static FileDescriptorProto GetGeneratorProto(const FileDescriptor& file); static FileDescriptorProto GetGeneratorProto(const FileDescriptor& file);
}; };
#endif // PROTOBUF_FUTURE_EDITIONS
} // namespace internal } // namespace internal
@ -504,19 +502,15 @@ class PROTOBUF_EXPORT Descriptor : private internal::SymbolBase {
private: private:
const Descriptor* containing_type_; const Descriptor* containing_type_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const FeatureSet* proto_features_; const FeatureSet* proto_features_;
const FeatureSet* merged_features_; const FeatureSet* merged_features_;
#endif // PROTOBUF_FUTURE_EDITIONS
#ifdef PROTOBUF_FUTURE_EDITIONS
// Get the merged features that apply to this extension range. These are // Get the merged features that apply to this extension range. These are
// specified in the .proto file through the feature options in the message // specified in the .proto file through the feature options in the message
// definition. Allowed features are defined by Features in descriptor.proto, // definition. Allowed features are defined by Features in descriptor.proto,
// along with any backend-specific extensions to it. // along with any backend-specific extensions to it.
const FeatureSet& features() const { return *merged_features_; } const FeatureSet& features() const { return *merged_features_; }
friend class internal::InternalFeatureHelper; friend class internal::InternalFeatureHelper;
#endif // PROTOBUF_FUTURE_EDITIONS
// Walks up the descriptor tree to generate the source location path // Walks up the descriptor tree to generate the source location path
// to this descriptor from the file root. // to this descriptor from the file root.
@ -641,14 +635,12 @@ class PROTOBUF_EXPORT Descriptor : private internal::SymbolBase {
friend class io::Printer; friend class io::Printer;
friend class compiler::cpp::Formatter; friend class compiler::cpp::Formatter;
#ifdef PROTOBUF_FUTURE_EDITIONS
// Get the merged features that apply to this message type. These are // Get the merged features that apply to this message type. These are
// specified in the .proto file through the feature options in the message // specified in the .proto file through the feature options in the message
// definition. Allowed features are defined by Features in descriptor.proto, // definition. Allowed features are defined by Features in descriptor.proto,
// along with any backend-specific extensions to it. // along with any backend-specific extensions to it.
const FeatureSet& features() const { return *merged_features_; } const FeatureSet& features() const { return *merged_features_; }
friend class internal::InternalFeatureHelper; friend class internal::InternalFeatureHelper;
#endif // PROTOBUF_FUTURE_EDITIONS
// Fill the json_name field of FieldDescriptorProto. // Fill the json_name field of FieldDescriptorProto.
void CopyJsonNameTo(DescriptorProto* proto) const; void CopyJsonNameTo(DescriptorProto* proto) const;
@ -688,10 +680,8 @@ class PROTOBUF_EXPORT Descriptor : private internal::SymbolBase {
const FileDescriptor* file_; const FileDescriptor* file_;
const Descriptor* containing_type_; const Descriptor* containing_type_;
const MessageOptions* options_; const MessageOptions* options_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const FeatureSet* proto_features_; const FeatureSet* proto_features_;
const FeatureSet* merged_features_; const FeatureSet* merged_features_;
#endif // PROTOBUF_FUTURE_EDITIONS
// These arrays are separated from their sizes to minimize padding on 64-bit. // These arrays are separated from their sizes to minimize padding on 64-bit.
FieldDescriptor* fields_; FieldDescriptor* fields_;
@ -728,11 +718,7 @@ class PROTOBUF_EXPORT Descriptor : private internal::SymbolBase {
friend class FileDescriptor; friend class FileDescriptor;
}; };
#ifdef PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(Descriptor, 152); PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(Descriptor, 152);
#else // PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(Descriptor, 136);
#endif // PROTOBUF_FUTURE_EDITIONS
// Describes a single field of a message. To get the descriptor for a given // Describes a single field of a message. To get the descriptor for a given
// field, first get the Descriptor for the message in which it is defined, // field, first get the Descriptor for the message in which it is defined,
@ -1046,14 +1032,12 @@ class PROTOBUF_EXPORT FieldDescriptor : private internal::SymbolBase {
private: private:
#ifdef PROTOBUF_FUTURE_EDITIONS
// Get the merged features that apply to this field. These are specified in // Get the merged features that apply to this field. These are specified in
// the .proto file through the feature options in the message definition. // the .proto file through the feature options in the message definition.
// Allowed features are defined by Features in descriptor.proto, along with // Allowed features are defined by Features in descriptor.proto, along with
// any backend-specific extensions to it. // any backend-specific extensions to it.
const FeatureSet& features() const { return *merged_features_; } const FeatureSet& features() const { return *merged_features_; }
friend class internal::InternalFeatureHelper; friend class internal::InternalFeatureHelper;
#endif // PROTOBUF_FUTURE_EDITIONS
// Fill the json_name field of FieldDescriptorProto. // Fill the json_name field of FieldDescriptorProto.
void CopyJsonNameTo(FieldDescriptorProto* proto) const; void CopyJsonNameTo(FieldDescriptorProto* proto) const;
@ -1122,10 +1106,8 @@ class PROTOBUF_EXPORT FieldDescriptor : private internal::SymbolBase {
mutable const EnumDescriptor* enum_type; mutable const EnumDescriptor* enum_type;
} type_descriptor_; } type_descriptor_;
const FieldOptions* options_; const FieldOptions* options_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const FeatureSet* proto_features_; const FeatureSet* proto_features_;
const FeatureSet* merged_features_; const FeatureSet* merged_features_;
#endif // PROTOBUF_FUTURE_EDITIONS
// IMPORTANT: If you add a new field, make sure to search for all instances // IMPORTANT: If you add a new field, make sure to search for all instances
// of Allocate<FieldDescriptor>() and AllocateArray<FieldDescriptor>() in // of Allocate<FieldDescriptor>() and AllocateArray<FieldDescriptor>() in
// descriptor.cc and update them to initialize the field. // descriptor.cc and update them to initialize the field.
@ -1160,11 +1142,7 @@ class PROTOBUF_EXPORT FieldDescriptor : private internal::SymbolBase {
friend class OneofDescriptor; friend class OneofDescriptor;
}; };
#ifdef PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(FieldDescriptor, 88); PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(FieldDescriptor, 88);
#else // PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(FieldDescriptor, 72);
#endif // PROTOBUF_FUTURE_EDITIONS
// Describes a oneof defined in a message type. // Describes a oneof defined in a message type.
class PROTOBUF_EXPORT OneofDescriptor : private internal::SymbolBase { class PROTOBUF_EXPORT OneofDescriptor : private internal::SymbolBase {
@ -1231,14 +1209,12 @@ class PROTOBUF_EXPORT OneofDescriptor : private internal::SymbolBase {
private: private:
#ifdef PROTOBUF_FUTURE_EDITIONS
// Get the merged features that apply to this oneof. These are specified in // Get the merged features that apply to this oneof. These are specified in
// the .proto file through the feature options in the oneof definition. // the .proto file through the feature options in the oneof definition.
// Allowed features are defined by Features in descriptor.proto, along with // Allowed features are defined by Features in descriptor.proto, along with
// any backend-specific extensions to it. // any backend-specific extensions to it.
const FeatureSet& features() const { return *merged_features_; } const FeatureSet& features() const { return *merged_features_; }
friend class internal::InternalFeatureHelper; friend class internal::InternalFeatureHelper;
#endif // PROTOBUF_FUTURE_EDITIONS
// See Descriptor::DebugString(). // See Descriptor::DebugString().
void DebugString(int depth, std::string* contents, void DebugString(int depth, std::string* contents,
@ -1254,10 +1230,8 @@ class PROTOBUF_EXPORT OneofDescriptor : private internal::SymbolBase {
const std::string* all_names_; const std::string* all_names_;
const Descriptor* containing_type_; const Descriptor* containing_type_;
const OneofOptions* options_; const OneofOptions* options_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const FeatureSet* proto_features_; const FeatureSet* proto_features_;
const FeatureSet* merged_features_; const FeatureSet* merged_features_;
#endif // PROTOBUF_FUTURE_EDITIONS
const FieldDescriptor* fields_; const FieldDescriptor* fields_;
// IMPORTANT: If you add a new field, make sure to search for all instances // IMPORTANT: If you add a new field, make sure to search for all instances
@ -1271,11 +1245,7 @@ class PROTOBUF_EXPORT OneofDescriptor : private internal::SymbolBase {
friend class FieldDescriptor; friend class FieldDescriptor;
}; };
#ifdef PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(OneofDescriptor, 56); PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(OneofDescriptor, 56);
#else // PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(OneofDescriptor, 40);
#endif // PROTOBUF_FUTURE_EDITIONS
// Describes an enum type defined in a .proto file. To get the EnumDescriptor // Describes an enum type defined in a .proto file. To get the EnumDescriptor
// for a generated enum type, call TypeName_descriptor(). Use DescriptorPool // for a generated enum type, call TypeName_descriptor(). Use DescriptorPool
@ -1406,14 +1376,12 @@ class PROTOBUF_EXPORT EnumDescriptor : private internal::SymbolBase {
// Allow access to FindValueByNumberCreatingIfUnknown. // Allow access to FindValueByNumberCreatingIfUnknown.
friend class descriptor_unittest::DescriptorTest; friend class descriptor_unittest::DescriptorTest;
#ifdef PROTOBUF_FUTURE_EDITIONS
// Get the merged features that apply to this enum type. These are specified // Get the merged features that apply to this enum type. These are specified
// in the .proto file through the feature options in the message definition. // in the .proto file through the feature options in the message definition.
// Allowed features are defined by Features in descriptor.proto, along with // Allowed features are defined by Features in descriptor.proto, along with
// any backend-specific extensions to it. // any backend-specific extensions to it.
const FeatureSet& features() const { return *merged_features_; } const FeatureSet& features() const { return *merged_features_; }
friend class internal::InternalFeatureHelper; friend class internal::InternalFeatureHelper;
#endif // PROTOBUF_FUTURE_EDITIONS
// Looks up a value by number. If the value does not exist, dynamically // Looks up a value by number. If the value does not exist, dynamically
// creates a new EnumValueDescriptor for that value, assuming that it was // creates a new EnumValueDescriptor for that value, assuming that it was
@ -1455,10 +1423,8 @@ class PROTOBUF_EXPORT EnumDescriptor : private internal::SymbolBase {
const FileDescriptor* file_; const FileDescriptor* file_;
const Descriptor* containing_type_; const Descriptor* containing_type_;
const EnumOptions* options_; const EnumOptions* options_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const FeatureSet* proto_features_; const FeatureSet* proto_features_;
const FeatureSet* merged_features_; const FeatureSet* merged_features_;
#endif // PROTOBUF_FUTURE_EDITIONS
EnumValueDescriptor* values_; EnumValueDescriptor* values_;
int reserved_range_count_; int reserved_range_count_;
@ -1482,11 +1448,7 @@ class PROTOBUF_EXPORT EnumDescriptor : private internal::SymbolBase {
friend class Reflection; friend class Reflection;
}; };
#ifdef PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(EnumDescriptor, 88); PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(EnumDescriptor, 88);
#else // PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(EnumDescriptor, 72);
#endif // PROTOBUF_FUTURE_EDITIONS
// Describes an individual enum constant of a particular type. To get the // Describes an individual enum constant of a particular type. To get the
// EnumValueDescriptor for a given enum value, first get the EnumDescriptor // EnumValueDescriptor for a given enum value, first get the EnumDescriptor
@ -1549,14 +1511,12 @@ class PROTOBUF_EXPORT EnumValueDescriptor : private internal::SymbolBaseN<0>,
friend class io::Printer; friend class io::Printer;
friend class compiler::cpp::Formatter; friend class compiler::cpp::Formatter;
#ifdef PROTOBUF_FUTURE_EDITIONS
// Get the merged features that apply to this enum value. These are specified // Get the merged features that apply to this enum value. These are specified
// in the .proto file through the feature options in the message definition. // in the .proto file through the feature options in the message definition.
// Allowed features are defined by Features in descriptor.proto, along with // Allowed features are defined by Features in descriptor.proto, along with
// any backend-specific extensions to it. // any backend-specific extensions to it.
const FeatureSet& features() const { return *merged_features_; } const FeatureSet& features() const { return *merged_features_; }
friend class internal::InternalFeatureHelper; friend class internal::InternalFeatureHelper;
#endif // PROTOBUF_FUTURE_EDITIONS
// See Descriptor::DebugString(). // See Descriptor::DebugString().
void DebugString(int depth, std::string* contents, void DebugString(int depth, std::string* contents,
@ -1571,10 +1531,8 @@ class PROTOBUF_EXPORT EnumValueDescriptor : private internal::SymbolBaseN<0>,
const std::string* all_names_; const std::string* all_names_;
const EnumDescriptor* type_; const EnumDescriptor* type_;
const EnumValueOptions* options_; const EnumValueOptions* options_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const FeatureSet* proto_features_; const FeatureSet* proto_features_;
const FeatureSet* merged_features_; const FeatureSet* merged_features_;
#endif // PROTOBUF_FUTURE_EDITIONS
// IMPORTANT: If you add a new field, make sure to search for all instances // IMPORTANT: If you add a new field, make sure to search for all instances
// of Allocate<EnumValueDescriptor>() and AllocateArray<EnumValueDescriptor>() // of Allocate<EnumValueDescriptor>() and AllocateArray<EnumValueDescriptor>()
// in descriptor.cc and update them to initialize the field. // in descriptor.cc and update them to initialize the field.
@ -1588,11 +1546,7 @@ class PROTOBUF_EXPORT EnumValueDescriptor : private internal::SymbolBaseN<0>,
friend class Reflection; friend class Reflection;
}; };
#ifdef PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(EnumValueDescriptor, 48); PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(EnumValueDescriptor, 48);
#else // PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(EnumValueDescriptor, 32);
#endif // PROTOBUF_FUTURE_EDITIONS
// Describes an RPC service. Use DescriptorPool to construct your own // Describes an RPC service. Use DescriptorPool to construct your own
// descriptors. // descriptors.
@ -1654,14 +1608,12 @@ class PROTOBUF_EXPORT ServiceDescriptor : private internal::SymbolBase {
friend class io::Printer; friend class io::Printer;
friend class compiler::cpp::Formatter; friend class compiler::cpp::Formatter;
#ifdef PROTOBUF_FUTURE_EDITIONS
// Get the merged features that apply to this service type. These are // Get the merged features that apply to this service type. These are
// specified in the .proto file through the feature options in the service // specified in the .proto file through the feature options in the service
// definition. Allowed features are defined by Features in descriptor.proto, // definition. Allowed features are defined by Features in descriptor.proto,
// along with any backend-specific extensions to it. // along with any backend-specific extensions to it.
const FeatureSet& features() const { return *merged_features_; } const FeatureSet& features() const { return *merged_features_; }
friend class internal::InternalFeatureHelper; friend class internal::InternalFeatureHelper;
#endif // PROTOBUF_FUTURE_EDITIONS
// See Descriptor::DebugString(). // See Descriptor::DebugString().
void DebugString(std::string* contents, void DebugString(std::string* contents,
@ -1675,10 +1627,8 @@ class PROTOBUF_EXPORT ServiceDescriptor : private internal::SymbolBase {
const std::string* all_names_; const std::string* all_names_;
const FileDescriptor* file_; const FileDescriptor* file_;
const ServiceOptions* options_; const ServiceOptions* options_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const FeatureSet* proto_features_; const FeatureSet* proto_features_;
const FeatureSet* merged_features_; const FeatureSet* merged_features_;
#endif // PROTOBUF_FUTURE_EDITIONS
MethodDescriptor* methods_; MethodDescriptor* methods_;
int method_count_; int method_count_;
// IMPORTANT: If you add a new field, make sure to search for all instances // IMPORTANT: If you add a new field, make sure to search for all instances
@ -1692,11 +1642,7 @@ class PROTOBUF_EXPORT ServiceDescriptor : private internal::SymbolBase {
friend class MethodDescriptor; friend class MethodDescriptor;
}; };
#ifdef PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(ServiceDescriptor, 64); PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(ServiceDescriptor, 64);
#else // PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(ServiceDescriptor, 48);
#endif // PROTOBUF_FUTURE_EDITIONS
// Describes an individual service method. To obtain a MethodDescriptor given // Describes an individual service method. To obtain a MethodDescriptor given
// a service, first get its ServiceDescriptor, then call // a service, first get its ServiceDescriptor, then call
@ -1763,14 +1709,12 @@ class PROTOBUF_EXPORT MethodDescriptor : private internal::SymbolBase {
friend class io::Printer; friend class io::Printer;
friend class compiler::cpp::Formatter; friend class compiler::cpp::Formatter;
#ifdef PROTOBUF_FUTURE_EDITIONS
// Get the merged features that apply to this method. These are specified in // Get the merged features that apply to this method. These are specified in
// the .proto file through the feature options in the method definition. // the .proto file through the feature options in the method definition.
// Allowed features are defined by Features in descriptor.proto, along with // Allowed features are defined by Features in descriptor.proto, along with
// any backend-specific extensions to it. // any backend-specific extensions to it.
const FeatureSet& features() const { return *merged_features_; } const FeatureSet& features() const { return *merged_features_; }
friend class internal::InternalFeatureHelper; friend class internal::InternalFeatureHelper;
#endif // PROTOBUF_FUTURE_EDITIONS
// See Descriptor::DebugString(). // See Descriptor::DebugString().
void DebugString(int depth, std::string* contents, void DebugString(int depth, std::string* contents,
@ -1788,10 +1732,8 @@ class PROTOBUF_EXPORT MethodDescriptor : private internal::SymbolBase {
mutable internal::LazyDescriptor input_type_; mutable internal::LazyDescriptor input_type_;
mutable internal::LazyDescriptor output_type_; mutable internal::LazyDescriptor output_type_;
const MethodOptions* options_; const MethodOptions* options_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const FeatureSet* proto_features_; const FeatureSet* proto_features_;
const FeatureSet* merged_features_; const FeatureSet* merged_features_;
#endif // PROTOBUF_FUTURE_EDITIONS
// IMPORTANT: If you add a new field, make sure to search for all instances // IMPORTANT: If you add a new field, make sure to search for all instances
// of Allocate<MethodDescriptor>() and AllocateArray<MethodDescriptor>() in // of Allocate<MethodDescriptor>() and AllocateArray<MethodDescriptor>() in
// descriptor.cc and update them to initialize the field. // descriptor.cc and update them to initialize the field.
@ -1802,11 +1744,7 @@ class PROTOBUF_EXPORT MethodDescriptor : private internal::SymbolBase {
friend class ServiceDescriptor; friend class ServiceDescriptor;
}; };
#ifdef PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(MethodDescriptor, 80); PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(MethodDescriptor, 80);
#else // PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(MethodDescriptor, 64);
#endif // PROTOBUF_FUTURE_EDITIONS
// Describes a whole .proto file. To get the FileDescriptor for a compiled-in // Describes a whole .proto file. To get the FileDescriptor for a compiled-in
// file, get the descriptor for something defined in that file and call // file, get the descriptor for something defined in that file and call
@ -1905,9 +1843,7 @@ class PROTOBUF_EXPORT FileDescriptor : private internal::SymbolBase {
SYNTAX_UNKNOWN = 0, SYNTAX_UNKNOWN = 0,
SYNTAX_PROTO2 = 2, SYNTAX_PROTO2 = 2,
SYNTAX_PROTO3 = 3, SYNTAX_PROTO3 = 3,
#ifdef PROTOBUF_FUTURE_EDITIONS
SYNTAX_EDITIONS = 99, SYNTAX_EDITIONS = 99,
#endif // PROTOBUF_FUTURE_EDITIONS
}; };
PROTOBUF_IGNORE_DEPRECATION_START PROTOBUF_IGNORE_DEPRECATION_START
ABSL_DEPRECATED( ABSL_DEPRECATED(
@ -1927,10 +1863,8 @@ class PROTOBUF_EXPORT FileDescriptor : private internal::SymbolBase {
PROTOBUF_IGNORE_DEPRECATION_STOP PROTOBUF_IGNORE_DEPRECATION_STOP
public: public:
#ifdef PROTOBUF_FUTURE_EDITIONS
// Returns an unspecified value if syntax() is not SYNTAX_EDITIONS. // Returns an unspecified value if syntax() is not SYNTAX_EDITIONS.
absl::string_view edition() const; absl::string_view edition() const;
#endif // PROTOBUF_FUTURE_EDITIONS
// Find a top-level message type by name (not full_name). Returns nullptr if // Find a top-level message type by name (not full_name). Returns nullptr if
// not found. // not found.
@ -2009,18 +1943,14 @@ class PROTOBUF_EXPORT FileDescriptor : private internal::SymbolBase {
const std::string* name_; const std::string* name_;
const std::string* package_; const std::string* package_;
const DescriptorPool* pool_; const DescriptorPool* pool_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const std::string* edition_ = nullptr; const std::string* edition_ = nullptr;
#endif // PROTOBUF_FUTURE_EDITIONS
#ifdef PROTOBUF_FUTURE_EDITIONS
// Get the merged features that apply to this file. These are specified in // Get the merged features that apply to this file. These are specified in
// the .proto file through the feature options in the message definition. // the .proto file through the feature options in the message definition.
// Allowed features are defined by FeatureSet in descriptor.proto, along with // Allowed features are defined by FeatureSet in descriptor.proto, along with
// any backend-specific extensions to it. // any backend-specific extensions to it.
const FeatureSet& features() const { return *merged_features_; } const FeatureSet& features() const { return *merged_features_; }
friend class internal::InternalFeatureHelper; friend class internal::InternalFeatureHelper;
#endif // PROTOBUF_FUTURE_EDITIONS
// dependencies_once_ contain a once_flag followed by N NUL terminated // dependencies_once_ contain a once_flag followed by N NUL terminated
// strings. Dependencies that do not need to be loaded will be empty. ie just // strings. Dependencies that do not need to be loaded will be empty. ie just
@ -2045,10 +1975,8 @@ class PROTOBUF_EXPORT FileDescriptor : private internal::SymbolBase {
ServiceDescriptor* services_; ServiceDescriptor* services_;
FieldDescriptor* extensions_; FieldDescriptor* extensions_;
const FileOptions* options_; const FileOptions* options_;
#ifdef PROTOBUF_FUTURE_EDITIONS
const FeatureSet* proto_features_; const FeatureSet* proto_features_;
const FeatureSet* merged_features_; const FeatureSet* merged_features_;
#endif // PROTOBUF_FUTURE_EDITIONS
const FileDescriptorTables* tables_; const FileDescriptorTables* tables_;
const SourceCodeInfo* source_code_info_; const SourceCodeInfo* source_code_info_;
@ -2070,11 +1998,7 @@ class PROTOBUF_EXPORT FileDescriptor : private internal::SymbolBase {
friend class ServiceDescriptor; friend class ServiceDescriptor;
}; };
#ifdef PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(FileDescriptor, 168); PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(FileDescriptor, 168);
#else // PROTOBUF_FUTURE_EDITIONS
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(FileDescriptor, 152);
#endif // PROTOBUF_FUTURE_EDITIONS
// =================================================================== // ===================================================================
@ -2220,10 +2144,8 @@ class PROTOBUF_EXPORT DescriptorPool {
OPTION_NAME, // name in assignment OPTION_NAME, // name in assignment
OPTION_VALUE, // value in option assignment OPTION_VALUE, // value in option assignment
IMPORT, // import error IMPORT, // import error
#ifdef PROTOBUF_FUTURE_EDITIONS EDITIONS, // editions-related error
EDITIONS, // editions-related error OTHER // some other problem
#endif // PROTOBUF_FUTURE_EDITIONS
OTHER // some other problem
}; };
static absl::string_view ErrorLocationName(ErrorLocation location); static absl::string_view ErrorLocationName(ErrorLocation location);

@ -79,9 +79,7 @@ class PROTOBUF_EXPORT FileDescriptorLegacy {
SYNTAX_UNKNOWN = FileDescriptor::SYNTAX_UNKNOWN, SYNTAX_UNKNOWN = FileDescriptor::SYNTAX_UNKNOWN,
SYNTAX_PROTO2 = FileDescriptor::SYNTAX_PROTO2, SYNTAX_PROTO2 = FileDescriptor::SYNTAX_PROTO2,
SYNTAX_PROTO3 = FileDescriptor::SYNTAX_PROTO3, SYNTAX_PROTO3 = FileDescriptor::SYNTAX_PROTO3,
#ifdef PROTOBUF_FUTURE_EDITIONS
SYNTAX_EDITIONS = FileDescriptor::SYNTAX_EDITIONS, SYNTAX_EDITIONS = FileDescriptor::SYNTAX_EDITIONS,
#endif // PROTOBUF_FUTURE_EDITIONS
}; };
Syntax syntax() const { return static_cast<Syntax>(desc_->syntax()); } Syntax syntax() const { return static_cast<Syntax>(desc_->syntax()); }
static absl::string_view SyntaxName(Syntax syntax) { static absl::string_view SyntaxName(Syntax syntax) {

@ -42,40 +42,38 @@
#include <tuple> #include <tuple>
#include <vector> #include <vector>
#include "google/protobuf/stubs/common.h"
#include "google/protobuf/any.pb.h" #include "google/protobuf/any.pb.h"
#include "google/protobuf/compiler/importer.h" #include "google/protobuf/compiler/importer.h"
#include "google/protobuf/compiler/parser.h" #include "google/protobuf/compiler/parser.h"
#include "google/protobuf/descriptor.pb.h" #include "google/protobuf/descriptor.pb.h"
#include "google/protobuf/descriptor.pb.h"
#include "google/protobuf/descriptor_database.h"
#include "google/protobuf/dynamic_message.h"
#include "google/protobuf/text_format.h"
#include <gmock/gmock.h>
#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
#include "absl/container/btree_set.h" #include "absl/container/btree_set.h"
#include "absl/container/flat_hash_set.h" #include "absl/container/flat_hash_set.h"
#include "absl/log/absl_check.h"
#include "absl/log/absl_log.h"
#include "absl/log/die_if_null.h" #include "absl/log/die_if_null.h"
#include "absl/log/scoped_mock_log.h" #include "absl/log/scoped_mock_log.h"
#include "absl/strings/str_format.h" #include "absl/strings/str_format.h"
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "absl/strings/substitute.h"
#include "google/protobuf/cpp_features.pb.h"
#include "google/protobuf/descriptor_legacy.h" #include "google/protobuf/descriptor_legacy.h"
#include "google/protobuf/test_textproto.h" #include "google/protobuf/test_textproto.h"
#include "google/protobuf/unittest.pb.h" #include "google/protobuf/unittest.pb.h"
#include "google/protobuf/unittest_custom_options.pb.h" #include "google/protobuf/unittest_custom_options.pb.h"
#ifdef PROTOBUF_FUTURE_EDITIONS
#include "google/protobuf/cpp_features.pb.h"
#include "google/protobuf/unittest_features.pb.h" #include "google/protobuf/unittest_features.pb.h"
#include "google/protobuf/unittest_invalid_features.pb.h" #include "google/protobuf/unittest_invalid_features.pb.h"
#endif // PROTOBUF_FUTURE_EDITIONS
#include "google/protobuf/stubs/common.h"
#include "google/protobuf/descriptor.pb.h"
#include "google/protobuf/descriptor_database.h"
#include "google/protobuf/dynamic_message.h"
#include "google/protobuf/text_format.h"
#include <gmock/gmock.h>
#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
#include "absl/log/absl_check.h"
#include "absl/log/absl_log.h"
#include "google/protobuf/unittest_lazy_dependencies.pb.h" #include "google/protobuf/unittest_lazy_dependencies.pb.h"
#include "google/protobuf/unittest_lazy_dependencies_custom_option.pb.h" #include "google/protobuf/unittest_lazy_dependencies_custom_option.pb.h"
#include "google/protobuf/unittest_lazy_dependencies_enum.pb.h" #include "google/protobuf/unittest_lazy_dependencies_enum.pb.h"
#include "google/protobuf/unittest_proto3_arena.pb.h" #include "google/protobuf/unittest_proto3_arena.pb.h"
#include "absl/strings/substitute.h"
// Must be included last. // Must be included last.
@ -497,7 +495,6 @@ TEST_F(FileDescriptorTest, Syntax) {
file->CopyTo(&other); file->CopyTo(&other);
EXPECT_EQ("proto3", other.syntax()); EXPECT_EQ("proto3", other.syntax());
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
{ {
proto.set_syntax("editions"); proto.set_syntax("editions");
proto.set_edition("very-cool"); proto.set_edition("very-cool");
@ -512,7 +509,6 @@ TEST_F(FileDescriptorTest, Syntax) {
EXPECT_EQ("editions", other.syntax()); EXPECT_EQ("editions", other.syntax());
EXPECT_EQ("very-cool", other.edition()); EXPECT_EQ("very-cool", other.edition());
} }
#endif // PROTOBUF_FUTURE_EDITIONS
} }
TEST_F(FileDescriptorTest, CopyHeadingTo) { TEST_F(FileDescriptorTest, CopyHeadingTo) {
@ -536,7 +532,6 @@ TEST_F(FileDescriptorTest, CopyHeadingTo) {
EXPECT_EQ(other.syntax(), "proto3"); EXPECT_EQ(other.syntax(), "proto3");
EXPECT_EQ(other.options().java_package(), "foo.bar.baz"); EXPECT_EQ(other.options().java_package(), "foo.bar.baz");
EXPECT_TRUE(other.message_type().empty()); EXPECT_TRUE(other.message_type().empty());
#ifdef PROTOBUF_FUTURE_EDITIONS
EXPECT_EQ(&other.options().features(), &FeatureSet::default_instance()); EXPECT_EQ(&other.options().features(), &FeatureSet::default_instance());
{ {
proto.set_syntax("editions"); proto.set_syntax("editions");
@ -556,7 +551,6 @@ TEST_F(FileDescriptorTest, CopyHeadingTo) {
EXPECT_TRUE(other.message_type().empty()); EXPECT_TRUE(other.message_type().empty());
EXPECT_EQ(&other.options().features(), &FeatureSet::default_instance()); EXPECT_EQ(&other.options().features(), &FeatureSet::default_instance());
} }
#endif // PROTOBUF_FUTURE_EDITIONS
} }
void ExtractDebugString( void ExtractDebugString(
@ -7178,7 +7172,6 @@ TEST_F(ValidationErrorTest, UnusedImportWithOtherError) {
"foo.proto: Foo.foo: EXTENDEE: \"Baz\" is not defined.\n"); "foo.proto: Foo.foo: EXTENDEE: \"Baz\" is not defined.\n");
} }
#ifdef PROTOBUF_FUTURE_EDITIONS
using FeaturesTest = ValidationErrorTest; using FeaturesTest = ValidationErrorTest;
template <typename T> template <typename T>
@ -9915,8 +9908,6 @@ INSTANTIATE_TEST_SUITE_P(
[](const ::testing::TestParamInfo<FeaturesDebugStringTest::ParamType>& [](const ::testing::TestParamInfo<FeaturesDebugStringTest::ParamType>&
info) { return std::string(std::get<0>(info.param)); }); info) { return std::string(std::get<0>(info.param)); });
#endif // PROTOBUF_FUTURE_EDITIONS
TEST_F(ValidationErrorTest, PackageTooLong) { TEST_F(ValidationErrorTest, PackageTooLong) {

@ -77,9 +77,7 @@ class Message; // message.h
class MessageFactory; // message.h class MessageFactory; // message.h
class Reflection; // message.h class Reflection; // message.h
class UnknownFieldSet; // unknown_field_set.h class UnknownFieldSet; // unknown_field_set.h
#ifdef PROTOBUF_FUTURE_EDITIONS
class FeatureSet; class FeatureSet;
#endif // PROTOBUF_FUTURE_EDITIONS
namespace internal { namespace internal {
class FieldSkipper; // wire_format_lite.h class FieldSkipper; // wire_format_lite.h
class WireFormat; class WireFormat;
@ -87,11 +85,9 @@ enum class LazyVerifyOption;
} // namespace internal } // namespace internal
} // namespace protobuf } // namespace protobuf
} // namespace google } // namespace google
#ifdef PROTOBUF_FUTURE_EDITIONS
namespace pb { namespace pb {
class CppFeatures; class CppFeatures;
} // namespace pb } // namespace pb
#endif // PROTOBUF_FUTURE_EDITIONS
namespace google { namespace google {
namespace protobuf { namespace protobuf {
@ -1554,7 +1550,6 @@ class ExtensionIdentifier {
extern PROTOBUF_ATTRIBUTE_WEAK ExtensionSet::LazyMessageExtension* extern PROTOBUF_ATTRIBUTE_WEAK ExtensionSet::LazyMessageExtension*
MaybeCreateLazyExtension(Arena* arena); MaybeCreateLazyExtension(Arena* arena);
#ifdef PROTOBUF_FUTURE_EDITIONS
// Define a specialization of ExtensionIdentifier for bootstrapped extensions // Define a specialization of ExtensionIdentifier for bootstrapped extensions
// that we need to register lazily. // that we need to register lazily.
template <> template <>
@ -1586,7 +1581,6 @@ class ExtensionIdentifier<FeatureSet, MessageTypeTraits<::pb::CppFeatures>, 11,
mutable absl::once_flag once_; mutable absl::once_flag once_;
}; };
#endif // PROTOBUF_FUTURE_EDITIONS
} // namespace internal } // namespace internal

@ -224,10 +224,6 @@ static_assert(PROTOBUF_CPLUSPLUS_MIN(201402L), "Protobuf only supports C++14 and
static_assert(PROTOBUF_ABSL_MIN(20230125, 3), static_assert(PROTOBUF_ABSL_MIN(20230125, 3),
"Protobuf only supports Abseil version 20230125.3 and newer."); "Protobuf only supports Abseil version 20230125.3 and newer.");
// Enable editions infrastructure by default. This should be a no-op without
// the --experimental_editions protoc flag.
#define PROTOBUF_FUTURE_EDITIONS 1
// Future versions of protobuf will include breaking changes to some APIs. // Future versions of protobuf will include breaking changes to some APIs.
// This macro can be set to enable these API changes ahead of time, so that // This macro can be set to enable these API changes ahead of time, so that
// user code can be updated before upgrading versions of protobuf. // user code can be updated before upgrading versions of protobuf.

Loading…
Cancel
Save