summaryrefslogtreecommitdiffstats
path: root/contrib/libs/protoc/src/google/protobuf/compiler/ruby
diff options
context:
space:
mode:
authorheretic <[email protected]>2022-06-14 13:29:31 +0300
committerheretic <[email protected]>2022-06-14 13:29:31 +0300
commit16f8be4f481c275c34795233c18f8d078382fcb3 (patch)
tree2363f1306ce2e17e72c0a48614256acd046990e6 /contrib/libs/protoc/src/google/protobuf/compiler/ruby
parent647dc68b78e469e5ab416e9b62885c9846fd511d (diff)
Update protobuf to 3.18.1
ref:4846abb21711ea0dc148d4c5df7b5edd3d1bdc69
Diffstat (limited to 'contrib/libs/protoc/src/google/protobuf/compiler/ruby')
-rw-r--r--contrib/libs/protoc/src/google/protobuf/compiler/ruby/ruby_generator.cc105
1 files changed, 48 insertions, 57 deletions
diff --git a/contrib/libs/protoc/src/google/protobuf/compiler/ruby/ruby_generator.cc b/contrib/libs/protoc/src/google/protobuf/compiler/ruby/ruby_generator.cc
index 83c941e154a..acf806a7e6d 100644
--- a/contrib/libs/protoc/src/google/protobuf/compiler/ruby/ruby_generator.cc
+++ b/contrib/libs/protoc/src/google/protobuf/compiler/ruby/ruby_generator.cc
@@ -490,41 +490,40 @@ bool UsesTypeFromFile(const Descriptor* message, const FileDescriptor* file,
return false;
}
-// Ruby doesn't currently support proto2. This causes a failure even for proto3
-// files that import proto2. But in some cases, the proto2 file is only being
-// imported to extend another proto2 message. The prime example is declaring
-// custom options by extending FileOptions/FieldOptions/etc.
-//
-// If the proto3 messages don't have any proto2 submessages, it is safe to omit
-// the dependency completely. Users won't be able to use any proto2 extensions,
-// but they already couldn't because proto2 messages aren't supported.
-//
-// If/when we add proto2 support, we should remove this.
-bool MaybeEmitDependency(const FileDescriptor* import,
- const FileDescriptor* from,
- io::Printer* printer,
- TProtoStringType* error) {
- if (from->syntax() == FileDescriptor::SYNTAX_PROTO3 &&
- import->syntax() == FileDescriptor::SYNTAX_PROTO2) {
- for (int i = 0; i < from->message_type_count(); i++) {
- if (UsesTypeFromFile(from->message_type(i), import, error)) {
- // Error text was already set by UsesTypeFromFile().
- return false;
- }
+bool GenerateDslDescriptor(const FileDescriptor* file, io::Printer* printer,
+ TProtoStringType* error) {
+ printer->Print(
+ "require 'google/protobuf'\n\n");
+ printer->Print("Google::Protobuf::DescriptorPool.generated_pool.build do\n");
+ printer->Indent();
+ printer->Print("add_file(\"$filename$\", :syntax => :$syntax$) do\n",
+ "filename", file->name(), "syntax",
+ StringifySyntax(file->syntax()));
+ printer->Indent();
+ for (int i = 0; i < file->message_type_count(); i++) {
+ if (!GenerateMessage(file->message_type(i), printer, error)) {
+ return false;
}
-
- // Ok to omit this proto2 dependency -- so we won't print anything.
- GOOGLE_LOG(WARNING) << "Omitting proto2 dependency '" << import->name()
- << "' from proto3 output file '"
- << GetOutputFilename(from->name())
- << "' because we don't support proto2 and no proto2 "
- "types from that file are being used.";
- return true;
- } else {
- printer->Print(
- "require '$name$'\n", "name", GetRequireName(import->name()));
- return true;
}
+ for (int i = 0; i < file->enum_type_count(); i++) {
+ GenerateEnum(file->enum_type(i), printer);
+ }
+ printer->Outdent();
+ printer->Print("end\n");
+ printer->Outdent();
+ printer->Print(
+ "end\n\n");
+ return true;
+}
+
+bool GenerateBinaryDescriptor(const FileDescriptor* file, io::Printer* printer,
+ TProtoStringType* error) {
+ printer->Print(
+ R"(descriptor_data = File.binread(__FILE__).split("\n__END__\n", 2)[1])");
+ printer->Print(
+ "\nGoogle::Protobuf::DescriptorPool.generated_pool.add_serialized_file("
+ "descriptor_data)\n\n");
+ return true;
}
bool GenerateFile(const FileDescriptor* file, io::Printer* printer,
@@ -535,13 +534,8 @@ bool GenerateFile(const FileDescriptor* file, io::Printer* printer,
"\n",
"filename", file->name());
- printer->Print(
- "require 'google/protobuf'\n\n");
-
for (int i = 0; i < file->dependency_count(); i++) {
- if (!MaybeEmitDependency(file->dependency(i), file, printer, error)) {
- return false;
- }
+ printer->Print("require '$name$'\n", "name", GetRequireName(file->dependency(i)->name()));
}
// TODO: Remove this when ruby supports extensions for proto2 syntax.
@@ -550,25 +544,13 @@ bool GenerateFile(const FileDescriptor* file, io::Printer* printer,
GOOGLE_LOG(WARNING) << "Extensions are not yet supported for proto2 .proto files.";
}
- printer->Print("Google::Protobuf::DescriptorPool.generated_pool.build do\n");
- printer->Indent();
- printer->Print("add_file(\"$filename$\", :syntax => :$syntax$) do\n",
- "filename", file->name(), "syntax",
- StringifySyntax(file->syntax()));
- printer->Indent();
- for (int i = 0; i < file->message_type_count(); i++) {
- if (!GenerateMessage(file->message_type(i), printer, error)) {
- return false;
- }
- }
- for (int i = 0; i < file->enum_type_count(); i++) {
- GenerateEnum(file->enum_type(i), printer);
+ bool use_raw_descriptor = file->name() == "google/protobuf/descriptor.proto";
+
+ if (use_raw_descriptor) {
+ GenerateBinaryDescriptor(file, printer, error);
+ } else {
+ GenerateDslDescriptor(file, printer, error);
}
- printer->Outdent();
- printer->Print("end\n");
- printer->Outdent();
- printer->Print(
- "end\n\n");
int levels = GeneratePackageModules(file, printer);
for (int i = 0; i < file->message_type_count(); i++) {
@@ -578,6 +560,15 @@ bool GenerateFile(const FileDescriptor* file, io::Printer* printer,
GenerateEnumAssignment("", file->enum_type(i), printer);
}
EndPackageModules(levels, printer);
+
+ if (use_raw_descriptor) {
+ printer->Print("\n__END__\n");
+ FileDescriptorProto file_proto;
+ file->CopyTo(&file_proto);
+ TProtoStringType file_data;
+ file_proto.SerializeToString(&file_data);
+ printer->Print("$raw_descriptor$", "raw_descriptor", file_data);
+ }
return true;
}