summaryrefslogtreecommitdiffstats
path: root/contrib/libs/protoc/src/google/protobuf/compiler/cpp/generator.cc
diff options
context:
space:
mode:
authornechda <[email protected]>2024-08-29 23:50:27 +0300
committernechda <[email protected]>2024-08-30 00:05:25 +0300
commite10d6638f07a82edae3ea8197b9f5c0affcc07ea (patch)
tree571c38cec05813766a1ad290c9d51ce7ace52919 /contrib/libs/protoc/src/google/protobuf/compiler/cpp/generator.cc
parente79b38f2bbbf78d295d1901d2a79f898022d5224 (diff)
Update cpp-protobuf to 22.5
Привет!\ Этот PR переключат cpp & python библиотеки protobuf на версию 22.5 Если у вас возникли проблемы после влития этого PR: 1. Если начали падать канон тесты, то проведите их переканонизацию 2. Прочитайте <https://wiki.yandex-team.ru/users/nechda/obnovlenie-cpp-protobuf-22.5/> страничку с основными изменениями 3. Если страничка в вики не помогла, то пишите в [DEVTOOLSSUPPORT](https://st.yandex-team.ru/DEVTOOLSSUPPORT) 7fecade616c20a841b9e9af7b7998bdfc8d2807d
Diffstat (limited to 'contrib/libs/protoc/src/google/protobuf/compiler/cpp/generator.cc')
-rw-r--r--contrib/libs/protoc/src/google/protobuf/compiler/cpp/generator.cc264
1 files changed, 156 insertions, 108 deletions
diff --git a/contrib/libs/protoc/src/google/protobuf/compiler/cpp/generator.cc b/contrib/libs/protoc/src/google/protobuf/compiler/cpp/generator.cc
index 0da2027a1e6..6187b72cbab 100644
--- a/contrib/libs/protoc/src/google/protobuf/compiler/cpp/generator.cc
+++ b/contrib/libs/protoc/src/google/protobuf/compiler/cpp/generator.cc
@@ -32,31 +32,68 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/generator.h>
+#include "google/protobuf/compiler/cpp/generator.h"
+#include <cstdlib>
#include <memory>
#include <string>
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/compiler/cpp/file.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "y_absl/strings/match.h"
+#include "y_absl/strings/str_cat.h"
+#include "y_absl/strings/string_view.h"
+#include "google/protobuf/compiler/cpp/file.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/descriptor.pb.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
+namespace {
+TProtoStringType NumberedCcFileName(y_absl::string_view basename, int number) {
+ return y_absl::StrCat(basename, ".out/", number, ".cc");
+}
-CppGenerator::CppGenerator() {}
-CppGenerator::~CppGenerator() {}
+y_absl::flat_hash_map<y_absl::string_view, TProtoStringType> CommonVars(
+ const Options& options) {
+ bool is_oss = options.opensource_runtime;
+ return {
+ {"proto_ns", ProtobufNamespace(options)},
+ {"pb", y_absl::StrCat("::", ProtobufNamespace(options))},
+ {"pbi", y_absl::StrCat("::", ProtobufNamespace(options), "::internal")},
-namespace {
-TProtoStringType NumberedCcFileName(const TProtoStringType& basename, int number) {
- return StrCat(basename, ".out/", number, ".cc");
+ {"string", "TProtoStringType"},
+ {"int8", "::int8_t"},
+ {"int32", "::arc_i32"},
+ {"int64", "::arc_i64"},
+ {"uint8", "::uint8_t"},
+ {"uint32", "::arc_ui32"},
+ {"uint64", "::arc_ui64"},
+
+ {"hrule_thick", kThickSeparator},
+ {"hrule_thin", kThinSeparator},
+
+ // Warning: there is some clever naming/splitting here to avoid extract
+ // script rewrites. The names of these variables must not be things that
+ // the extract script will rewrite. That's why we use "CHK" (for example)
+ // instead of "Y_ABSL_CHECK".
+ //
+ // These values are things the extract script would rewrite if we did not
+ // split them. It might not strictly matter since we don't generate
+ // google3 code in open-source. But it's good to prevent surprising
+ // things from happening.
+ {"GOOGLE_PROTOBUF", is_oss ? "GOOGLE_PROTOBUF"
+ : "GOOGLE3_PROTOBU"
+ "F"},
+ {"CHK",
+ "Y_ABSL_CHEC"
+ "K"},
+ {"DCHK",
+ "Y_ABSL_DCHEC"
+ "K"},
+ };
}
} // namespace
@@ -64,7 +101,7 @@ bool CppGenerator::Generate(const FileDescriptor* file,
const TProtoStringType& parameter,
GeneratorContext* generator_context,
TProtoStringType* error) const {
- std::vector<std::pair<TProtoStringType, TProtoStringType> > options;
+ std::vector<std::pair<TProtoStringType, TProtoStringType>> options;
ParseGeneratorParameter(parameter, &options);
// -----------------------------------------------------------------
@@ -93,72 +130,69 @@ bool CppGenerator::Generate(const FileDescriptor* file,
file_options.opensource_runtime = opensource_runtime_;
file_options.runtime_include_base = runtime_include_base_;
- for (int i = 0; i < options.size(); i++) {
- if (options[i].first == "dllexport_decl") {
- file_options.dllexport_decl = options[i].second;
- } else if (options[i].first == "safe_boundary_check") {
+ for (const auto& option : options) {
+ const auto& key = option.first;
+ const auto& value = option.second;
+
+ if (key == "dllexport_decl") {
+ file_options.dllexport_decl = value;
+ } else if (key == "safe_boundary_check") {
file_options.safe_boundary_check = true;
- } else if (options[i].first == "annotate_headers") {
+ } else if (key == "annotate_headers") {
file_options.annotate_headers = true;
- } else if (options[i].first == "annotation_pragma_name") {
- file_options.annotation_pragma_name = options[i].second;
- } else if (options[i].first == "annotation_guard_name") {
- file_options.annotation_guard_name = options[i].second;
- } else if (options[i].first == "speed") {
+ } else if (key == "annotation_pragma_name") {
+ file_options.annotation_pragma_name = value;
+ } else if (key == "annotation_guard_name") {
+ file_options.annotation_guard_name = value;
+ } else if (key == "speed") {
file_options.enforce_mode = EnforceOptimizeMode::kSpeed;
- } else if (options[i].first == "code_size") {
+ } else if (key == "code_size") {
file_options.enforce_mode = EnforceOptimizeMode::kCodeSize;
- } else if (options[i].first == "lite") {
+ } else if (key == "lite") {
file_options.enforce_mode = EnforceOptimizeMode::kLiteRuntime;
- } else if (options[i].first == "lite_implicit_weak_fields") {
+ } else if (key == "lite_implicit_weak_fields") {
file_options.enforce_mode = EnforceOptimizeMode::kLiteRuntime;
file_options.lite_implicit_weak_fields = true;
- if (!options[i].second.empty()) {
- file_options.num_cc_files =
- strto32(options[i].second.c_str(), nullptr, 10);
+ if (!value.empty()) {
+ file_options.num_cc_files = std::strtol(value.c_str(), nullptr, 10);
}
- } else if (options[i].first == "proto_h") {
+ } else if (key == "proto_h") {
file_options.proto_h = true;
- } else if (options[i].first == "annotate_accessor") {
+ } else if (key == "proto_static_reflection_h") {
+ } else if (key == "annotate_accessor") {
file_options.annotate_accessor = true;
- } else if (options[i].first == "inject_field_listener_events") {
+ } else if (key == "inject_field_listener_events") {
file_options.field_listener_options.inject_field_listener_events = true;
- } else if (options[i].first == "forbidden_field_listener_events") {
+ } else if (key == "forbidden_field_listener_events") {
std::size_t pos = 0;
do {
- std::size_t next_pos = options[i].second.find_first_of("+", pos);
+ std::size_t next_pos = value.find_first_of("+", pos);
if (next_pos == TProtoStringType::npos) {
- next_pos = options[i].second.size();
+ next_pos = value.size();
}
if (next_pos > pos)
file_options.field_listener_options.forbidden_field_listener_events
- .insert(options[i].second.substr(pos, next_pos - pos));
+ .emplace(value.substr(pos, next_pos - pos));
pos = next_pos + 1;
- } while (pos < options[i].second.size());
- } else if (options[i].first == "verified_lazy") {
- file_options.unverified_lazy = false;
- } else if (options[i].first == "unverified_lazy_message_sets") {
+ } while (pos < value.size());
+ } else if (key == "unverified_lazy_message_sets") {
file_options.unverified_lazy_message_sets = true;
- } else if (options[i].first == "message_owned_arena_trial") {
- file_options.message_owned_arena_trial = true;
- } else if (options[i].first == "force_eagerly_verified_lazy") {
+ } else if (key == "force_eagerly_verified_lazy") {
file_options.force_eagerly_verified_lazy = true;
- } else if (options[i].first == "experimental_tail_call_table_mode") {
- if (options[i].second == "never") {
+ } else if (key == "experimental_tail_call_table_mode") {
+ if (value == "never") {
file_options.tctable_mode = Options::kTCTableNever;
- } else if (options[i].second == "guarded") {
+ } else if (value == "guarded") {
file_options.tctable_mode = Options::kTCTableGuarded;
- } else if (options[i].second == "always") {
+ } else if (value == "always") {
file_options.tctable_mode = Options::kTCTableAlways;
} else {
- *error = "Unknown value for experimental_tail_call_table_mode: " +
- options[i].second;
+ *error = y_absl::StrCat(
+ "Unknown value for experimental_tail_call_table_mode: ", value);
return false;
}
- } else if (options[i].first == "transitive_pb_h") {
- file_options.transitive_pb_h = options[i].second != "false";
} else {
- *error = "Unknown generator option: " + options[i].first;
+ *error = y_absl::StrCat("Unknown generator option: ", key);
return false;
}
}
@@ -176,6 +210,17 @@ bool CppGenerator::Generate(const FileDescriptor* file,
TProtoStringType basename = StripProto(file->name());
+ auto generate_reserved_static_reflection_header = [&basename,
+ &generator_context]() {
+ auto output = y_absl::WrapUnique(generator_context->Open(
+ y_absl::StrCat(basename, ".proto.static_reflection.h")));
+ io::Printer(output.get()).Emit(R"cc(
+ // Reserved for future use.
+ )cc");
+ };
+ // Suppress maybe unused warning.
+ (void)generate_reserved_static_reflection_header;
+
if (MaybeBootstrap(file_options, generator_context, file_options.bootstrap,
&basename)) {
return true;
@@ -185,58 +230,51 @@ bool CppGenerator::Generate(const FileDescriptor* file,
// Generate header(s).
if (file_options.proto_h) {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(basename + ".proto.h"));
+ auto output = y_absl::WrapUnique(
+ generator_context->Open(y_absl::StrCat(basename, ".proto.h")));
+
GeneratedCodeInfo annotations;
io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
&annotations);
- TProtoStringType info_path = basename + ".proto.h.meta";
- io::Printer printer(
- output.get(), '$',
- file_options.annotate_headers ? &annotation_collector : nullptr);
+ io::Printer::Options options;
+ if (file_options.annotate_headers) {
+ options.annotation_collector = &annotation_collector;
+ }
+
+ io::Printer p(output.get(), options);
+ auto v = p.WithVars(CommonVars(file_options));
+
+ TProtoStringType info_path = y_absl::StrCat(basename, ".proto.h.meta");
file_generator.GenerateProtoHeader(
- &printer, file_options.annotate_headers ? info_path : "");
+ &p, file_options.annotate_headers ? info_path : "");
+
if (file_options.annotate_headers) {
- std::unique_ptr<io::ZeroCopyOutputStream> info_output(
- generator_context->Open(info_path));
+ auto info_output = y_absl::WrapUnique(generator_context->Open(info_path));
annotations.SerializeToZeroCopyStream(info_output.get());
}
}
{
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(basename + ".pb.h"));
+ auto output = y_absl::WrapUnique(
+ generator_context->Open(y_absl::StrCat(basename, ".pb.h")));
+
GeneratedCodeInfo annotations;
io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
&annotations);
- TProtoStringType info_path = basename + ".pb.h.meta";
- io::Printer printer(
- output.get(), '$',
- file_options.annotate_headers ? &annotation_collector : nullptr);
- file_generator.GeneratePBHeader(
- &printer, file_options.annotate_headers ? info_path : "");
+ io::Printer::Options options;
if (file_options.annotate_headers) {
- std::unique_ptr<io::ZeroCopyOutputStream> info_output(
- generator_context->Open(info_path));
- annotations.SerializeToZeroCopyStream(info_output.get());
+ options.annotation_collector = &annotation_collector;
}
- }
- if (!file_options.transitive_pb_h) {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(basename + ".deps.pb.h"));
- GeneratedCodeInfo annotations;
- io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
- &annotations);
- TProtoStringType info_path = basename + ".deps.pb.h.meta";
- io::Printer printer(
- output.get(), '$',
- file_options.annotate_headers ? &annotation_collector : NULL);
- file_generator.GeneratePBDeps(
- &printer, file_options.annotate_headers ? info_path : "");
+ io::Printer p(output.get(), options);
+ auto v = p.WithVars(CommonVars(file_options));
+
+ TProtoStringType info_path = y_absl::StrCat(basename, ".pb.h.meta");
+ file_generator.GeneratePBHeader(
+ &p, file_options.annotate_headers ? info_path : "");
+
if (file_options.annotate_headers) {
- std::unique_ptr<io::ZeroCopyOutputStream> info_output(
- generator_context->Open(info_path));
+ auto info_output = y_absl::WrapUnique(generator_context->Open(info_path));
annotations.SerializeToZeroCopyStream(info_output.get());
}
}
@@ -246,10 +284,12 @@ bool CppGenerator::Generate(const FileDescriptor* file,
{
// This is the global .cc file, containing
// enum/services/tables/reflection
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(basename + ".pb.cc"));
- io::Printer printer(output.get(), '$');
- file_generator.GenerateGlobalSource(&printer);
+ auto output = y_absl::WrapUnique(
+ generator_context->Open(y_absl::StrCat(basename, ".pb.cc")));
+ io::Printer p(output.get());
+ auto v = p.WithVars(CommonVars(file_options));
+
+ file_generator.GenerateGlobalSource(&p);
}
int num_cc_files =
@@ -260,40 +300,48 @@ bool CppGenerator::Generate(const FileDescriptor* file,
// pb.cc file. If we have more files than messages, then some files will
// be generated as empty placeholders.
if (file_options.num_cc_files > 0) {
- GOOGLE_CHECK_LE(num_cc_files, file_options.num_cc_files)
+ Y_ABSL_CHECK_LE(num_cc_files, file_options.num_cc_files)
<< "There must be at least as many numbered .cc files as messages "
"and extensions.";
num_cc_files = file_options.num_cc_files;
}
+
int cc_file_number = 0;
- for (int i = 0; i < file_generator.NumMessages(); i++) {
- std::unique_ptr<io::ZeroCopyOutputStream> output(generator_context->Open(
+ for (int i = 0; i < file_generator.NumMessages(); ++i) {
+ auto output = y_absl::WrapUnique(generator_context->Open(
NumberedCcFileName(basename, cc_file_number++)));
- io::Printer printer(output.get(), '$');
- file_generator.GenerateSourceForMessage(i, &printer);
+ io::Printer p(output.get());
+ auto v = p.WithVars(CommonVars(file_options));
+
+ file_generator.GenerateSourceForMessage(i, &p);
}
- for (int i = 0; i < file_generator.NumExtensions(); i++) {
- std::unique_ptr<io::ZeroCopyOutputStream> output(generator_context->Open(
+
+ for (int i = 0; i < file_generator.NumExtensions(); ++i) {
+ auto output = y_absl::WrapUnique(generator_context->Open(
NumberedCcFileName(basename, cc_file_number++)));
- io::Printer printer(output.get(), '$');
- file_generator.GenerateSourceForExtension(i, &printer);
+ io::Printer p(output.get());
+ auto v = p.WithVars(CommonVars(file_options));
+
+ file_generator.GenerateSourceForExtension(i, &p);
}
+
// Create empty placeholder files if necessary to match the expected number
// of files.
- for (; cc_file_number < num_cc_files; ++cc_file_number) {
- std::unique_ptr<io::ZeroCopyOutputStream> output(generator_context->Open(
- NumberedCcFileName(basename, cc_file_number)));
+ while (cc_file_number < num_cc_files) {
+ (void)y_absl::WrapUnique(generator_context->Open(
+ NumberedCcFileName(basename, cc_file_number++)));
}
} else {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(basename + ".pb.cc"));
- io::Printer printer(output.get(), '$');
- file_generator.GenerateSource(&printer);
+ auto output = y_absl::WrapUnique(
+ generator_context->Open(y_absl::StrCat(basename, ".pb.cc")));
+ io::Printer p(output.get());
+ auto v = p.WithVars(CommonVars(file_options));
+
+ file_generator.GenerateSource(&p);
}
return true;
}
-
} // namespace cpp
} // namespace compiler
} // namespace protobuf