| Index: third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc
|
| index 1f0a8205ebff40afe229eeb5b5c43ec51f86e246..4eb89f432064f78065b4bbaf07ca960e1c74cf41 100644
|
| --- a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc
|
| @@ -1,6 +1,6 @@
|
| // Protocol Buffers - Google's data interchange format
|
| // Copyright 2008 Google Inc. All rights reserved.
|
| -// https://developers.google.com/protocol-buffers/
|
| +// http://code.google.com/p/protobuf/
|
| //
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| @@ -33,12 +33,6 @@
|
| // Sanjay Ghemawat, Jeff Dean, and others.
|
|
|
| #include <google/protobuf/compiler/cpp/cpp_file.h>
|
| -#include <memory>
|
| -#ifndef _SHARED_PTR_H
|
| -#include <google/protobuf/stubs/shared_ptr.h>
|
| -#endif
|
| -#include <set>
|
| -
|
| #include <google/protobuf/compiler/cpp/cpp_enum.h>
|
| #include <google/protobuf/compiler/cpp/cpp_service.h>
|
| #include <google/protobuf/compiler/cpp/cpp_extension.h>
|
| @@ -56,17 +50,18 @@ namespace cpp {
|
|
|
| // ===================================================================
|
|
|
| -FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options)
|
| - : file_(file),
|
| - message_generators_(
|
| - new google::protobuf::scoped_ptr<MessageGenerator>[file->message_type_count()]),
|
| - enum_generators_(
|
| - new google::protobuf::scoped_ptr<EnumGenerator>[file->enum_type_count()]),
|
| - service_generators_(
|
| - new google::protobuf::scoped_ptr<ServiceGenerator>[file->service_count()]),
|
| - extension_generators_(
|
| - new google::protobuf::scoped_ptr<ExtensionGenerator>[file->extension_count()]),
|
| - options_(options) {
|
| +FileGenerator::FileGenerator(const FileDescriptor* file,
|
| + const Options& options)
|
| + : file_(file),
|
| + message_generators_(
|
| + new scoped_ptr<MessageGenerator>[file->message_type_count()]),
|
| + enum_generators_(
|
| + new scoped_ptr<EnumGenerator>[file->enum_type_count()]),
|
| + service_generators_(
|
| + new scoped_ptr<ServiceGenerator>[file->service_count()]),
|
| + extension_generators_(
|
| + new scoped_ptr<ExtensionGenerator>[file->extension_count()]),
|
| + options_(options) {
|
|
|
| for (int i = 0; i < file->message_type_count(); i++) {
|
| message_generators_[i].reset(
|
| @@ -94,57 +89,217 @@ FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options)
|
| FileGenerator::~FileGenerator() {}
|
|
|
| void FileGenerator::GenerateHeader(io::Printer* printer) {
|
| - GenerateTopHeaderGuard(printer);
|
| + string filename_identifier = FilenameIdentifier(file_->name());
|
| +
|
| + // Generate top of header.
|
| + printer->Print(
|
| + "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
|
| + "// source: $filename$\n"
|
| + "\n"
|
| + "#ifndef PROTOBUF_$filename_identifier$__INCLUDED\n"
|
| + "#define PROTOBUF_$filename_identifier$__INCLUDED\n"
|
| + "\n"
|
| + "#include <string>\n"
|
| + "\n",
|
| + "filename", file_->name(),
|
| + "filename_identifier", filename_identifier);
|
|
|
| - GenerateLibraryIncludes(printer);
|
| - GenerateDependencyIncludes(printer);
|
|
|
| printer->Print(
|
| - "// @@protoc_insertion_point(includes)\n");
|
| + "#include <google/protobuf/stubs/common.h>\n"
|
| + "\n");
|
| +
|
| + // Verify the protobuf library header version is compatible with the protoc
|
| + // version before going any further.
|
| + printer->Print(
|
| + "#if GOOGLE_PROTOBUF_VERSION < $min_header_version$\n"
|
| + "#error This file was generated by a newer version of protoc which is\n"
|
| + "#error incompatible with your Protocol Buffer headers. Please update\n"
|
| + "#error your headers.\n"
|
| + "#endif\n"
|
| + "#if $protoc_version$ < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION\n"
|
| + "#error This file was generated by an older version of protoc which is\n"
|
| + "#error incompatible with your Protocol Buffer headers. Please\n"
|
| + "#error regenerate this file with a newer version of protoc.\n"
|
| + "#endif\n"
|
| + "\n",
|
| + "min_header_version",
|
| + SimpleItoa(protobuf::internal::kMinHeaderVersionForProtoc),
|
| + "protoc_version", SimpleItoa(GOOGLE_PROTOBUF_VERSION));
|
| +
|
| + // OK, it's now safe to #include other files.
|
| + printer->Print(
|
| + "#include <google/protobuf/generated_message_util.h>\n");
|
| + if (file_->message_type_count() > 0) {
|
| + if (HasDescriptorMethods(file_)) {
|
| + printer->Print(
|
| + "#include <google/protobuf/message.h>\n");
|
| + } else {
|
| + printer->Print(
|
| + "#include <google/protobuf/message_lite.h>\n");
|
| + }
|
| + }
|
| + printer->Print(
|
| + "#include <google/protobuf/repeated_field.h>\n"
|
| + "#include <google/protobuf/extension_set.h>\n");
|
|
|
| + if (HasUnknownFields(file_)) {
|
| + printer->Print(
|
| + "#include <google/protobuf/unknown_field_set.h>\n");
|
| + }
|
| +
|
| + if (HasDescriptorMethods(file_) && HasEnumDefinitions(file_)) {
|
| + printer->Print(
|
| + "#include <google/protobuf/generated_enum_reflection.h>\n");
|
| + }
|
| +
|
| + if (HasGenericServices(file_)) {
|
| + printer->Print(
|
| + "#include <google/protobuf/service.h>\n");
|
| + }
|
| +
|
| + if (HasUnknownFields(file_) && file_->message_type_count() > 0) {
|
| + printer->Print(
|
| + "#include <google/protobuf/unknown_field_set.h>\n");
|
| + }
|
| +
|
| +
|
| + for (int i = 0; i < file_->dependency_count(); i++) {
|
| + printer->Print(
|
| + "#include \"$dependency$.pb.h\"\n",
|
| + "dependency", StripProto(file_->dependency(i)->name()));
|
| + }
|
| +
|
| +
|
| + printer->Print(
|
| + "// @@protoc_insertion_point(includes)\n");
|
|
|
|
|
| // Open namespace.
|
| GenerateNamespaceOpeners(printer);
|
|
|
| - GenerateGlobalStateFunctionDeclarations(printer);
|
| - GenerateMessageForwardDeclarations(printer);
|
| + // Forward-declare the AddDescriptors, AssignDescriptors, and ShutdownFile
|
| + // functions, so that we can declare them to be friends of each class.
|
| + printer->Print(
|
| + "\n"
|
| + "// Internal implementation detail -- do not call these.\n"
|
| + "void $dllexport_decl$ $adddescriptorsname$();\n",
|
| + "adddescriptorsname", GlobalAddDescriptorsName(file_->name()),
|
| + "dllexport_decl", options_.dllexport_decl);
|
| +
|
| + printer->Print(
|
| + // Note that we don't put dllexport_decl on these because they are only
|
| + // called by the .pb.cc file in which they are defined.
|
| + "void $assigndescriptorsname$();\n"
|
| + "void $shutdownfilename$();\n"
|
| + "\n",
|
| + "assigndescriptorsname", GlobalAssignDescriptorsName(file_->name()),
|
| + "shutdownfilename", GlobalShutdownFileName(file_->name()));
|
| +
|
| + // Generate forward declarations of classes.
|
| + for (int i = 0; i < file_->message_type_count(); i++) {
|
| + message_generators_[i]->GenerateForwardDeclaration(printer);
|
| + }
|
|
|
| printer->Print("\n");
|
|
|
| - GenerateEnumDefinitions(printer);
|
| + // Generate enum definitions.
|
| + for (int i = 0; i < file_->message_type_count(); i++) {
|
| + message_generators_[i]->GenerateEnumDefinitions(printer);
|
| + }
|
| + for (int i = 0; i < file_->enum_type_count(); i++) {
|
| + enum_generators_[i]->GenerateDefinition(printer);
|
| + }
|
|
|
| printer->Print(kThickSeparator);
|
| printer->Print("\n");
|
|
|
| - GenerateMessageDefinitions(printer);
|
| + // Generate class definitions.
|
| + for (int i = 0; i < file_->message_type_count(); i++) {
|
| + if (i > 0) {
|
| + printer->Print("\n");
|
| + printer->Print(kThinSeparator);
|
| + printer->Print("\n");
|
| + }
|
| + message_generators_[i]->GenerateClassDefinition(printer);
|
| + }
|
|
|
| printer->Print("\n");
|
| printer->Print(kThickSeparator);
|
| printer->Print("\n");
|
|
|
| - GenerateServiceDefinitions(printer);
|
| + if (HasGenericServices(file_)) {
|
| + // Generate service definitions.
|
| + for (int i = 0; i < file_->service_count(); i++) {
|
| + if (i > 0) {
|
| + printer->Print("\n");
|
| + printer->Print(kThinSeparator);
|
| + printer->Print("\n");
|
| + }
|
| + service_generators_[i]->GenerateDeclarations(printer);
|
| + }
|
| +
|
| + printer->Print("\n");
|
| + printer->Print(kThickSeparator);
|
| + printer->Print("\n");
|
| + }
|
|
|
| - GenerateExtensionIdentifiers(printer);
|
| + // Declare extension identifiers.
|
| + for (int i = 0; i < file_->extension_count(); i++) {
|
| + extension_generators_[i]->GenerateDeclaration(printer);
|
| + }
|
|
|
| printer->Print("\n");
|
| printer->Print(kThickSeparator);
|
| printer->Print("\n");
|
|
|
| - GenerateInlineFunctionDefinitions(printer);
|
| + // Generate class inline methods.
|
| + for (int i = 0; i < file_->message_type_count(); i++) {
|
| + if (i > 0) {
|
| + printer->Print(kThinSeparator);
|
| + printer->Print("\n");
|
| + }
|
| + message_generators_[i]->GenerateInlineMethods(printer);
|
| + }
|
| +
|
| + printer->Print(
|
| + "\n"
|
| + "// @@protoc_insertion_point(namespace_scope)\n");
|
|
|
| // Close up namespace.
|
| GenerateNamespaceClosers(printer);
|
|
|
| - // We need to specialize some templates in the ::google::protobuf namespace:
|
| - GenerateProto2NamespaceEnumSpecializations(printer);
|
| + // Emit GetEnumDescriptor specializations into google::protobuf namespace:
|
| + if (HasDescriptorMethods(file_)) {
|
| + // The SWIG conditional is to avoid a null-pointer dereference
|
| + // (bug 1984964) in swig-1.3.21 resulting from the following syntax:
|
| + // namespace X { void Y<Z::W>(); }
|
| + // which appears in GetEnumDescriptor() specializations.
|
| + printer->Print(
|
| + "\n"
|
| + "#ifndef SWIG\n"
|
| + "namespace google {\nnamespace protobuf {\n"
|
| + "\n");
|
| + for (int i = 0; i < file_->message_type_count(); i++) {
|
| + message_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
|
| + }
|
| + for (int i = 0; i < file_->enum_type_count(); i++) {
|
| + enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
|
| + }
|
| + printer->Print(
|
| + "\n"
|
| + "} // namespace google\n} // namespace protobuf\n"
|
| + "#endif // SWIG\n");
|
| + }
|
|
|
| printer->Print(
|
| "\n"
|
| "// @@protoc_insertion_point(global_scope)\n"
|
| "\n");
|
|
|
| - GenerateBottomHeaderGuard(printer);
|
| + printer->Print(
|
| + "#endif // PROTOBUF_$filename_identifier$__INCLUDED\n",
|
| + "filename_identifier", filename_identifier);
|
| }
|
|
|
| void FileGenerator::GenerateSource(io::Printer* printer) {
|
| @@ -167,12 +322,6 @@ void FileGenerator::GenerateSource(io::Printer* printer) {
|
| "filename", file_->name(),
|
| "basename", StripProto(file_->name()));
|
|
|
| - // Unknown fields implementation in lite mode uses StringOutputStream
|
| - if (!UseUnknownFieldSet(file_) && file_->message_type_count() > 0) {
|
| - printer->Print(
|
| - "#include <google/protobuf/io/zero_copy_stream_impl_lite.h>\n");
|
| - }
|
| -
|
| if (HasDescriptorMethods(file_)) {
|
| printer->Print(
|
| "#include <google/protobuf/descriptor.h>\n"
|
| @@ -225,29 +374,10 @@ void FileGenerator::GenerateSource(io::Printer* printer) {
|
|
|
| // Generate classes.
|
| for (int i = 0; i < file_->message_type_count(); i++) {
|
| - if (i == 0 && HasGeneratedMethods(file_)) {
|
| - printer->Print(
|
| - "\n"
|
| - "namespace {\n"
|
| - "\n"
|
| - "static void MergeFromFail(int line) GOOGLE_ATTRIBUTE_COLD;\n"
|
| - "static void MergeFromFail(int line) {\n"
|
| - " GOOGLE_CHECK(false) << __FILE__ << \":\" << line;\n"
|
| - "}\n"
|
| - "\n"
|
| - "} // namespace\n"
|
| - "\n");
|
| - }
|
| printer->Print("\n");
|
| printer->Print(kThickSeparator);
|
| printer->Print("\n");
|
| message_generators_[i]->GenerateClassMethods(printer);
|
| -
|
| - printer->Print("#if PROTOBUF_INLINE_NOT_IN_HEADERS\n");
|
| - // Generate class inline methods.
|
| - message_generators_[i]->GenerateInlineMethods(printer,
|
| - /* is_inline = */ false);
|
| - printer->Print("#endif // PROTOBUF_INLINE_NOT_IN_HEADERS\n");
|
| }
|
|
|
| if (HasGenericServices(file_)) {
|
| @@ -417,12 +547,17 @@ void FileGenerator::GenerateBuildDescriptors(io::Printer* printer) {
|
| for (int i = 0; i < file_->dependency_count(); i++) {
|
| const FileDescriptor* dependency = file_->dependency(i);
|
| // Print the namespace prefix for the dependency.
|
| - string add_desc_name = QualifiedFileLevelSymbol(
|
| - dependency->package(), GlobalAddDescriptorsName(dependency->name()));
|
| + vector<string> dependency_package_parts;
|
| + SplitStringUsing(dependency->package(), ".", &dependency_package_parts);
|
| + printer->Print("::");
|
| + for (int j = 0; j < dependency_package_parts.size(); j++) {
|
| + printer->Print("$name$::",
|
| + "name", dependency_package_parts[j]);
|
| + }
|
| // Call its AddDescriptors function.
|
| printer->Print(
|
| "$name$();\n",
|
| - "name", add_desc_name);
|
| + "name", GlobalAddDescriptorsName(dependency->name()));
|
| }
|
|
|
| if (HasDescriptorMethods(file_)) {
|
| @@ -434,52 +569,20 @@ void FileGenerator::GenerateBuildDescriptors(io::Printer* printer) {
|
| string file_data;
|
| file_proto.SerializeToString(&file_data);
|
|
|
| - // Workaround for MSVC: "Error C1091: compiler limit: string exceeds 65535
|
| - // bytes in length". Declare a static array of characters rather than use a
|
| - // string literal.
|
| - if (file_data.size() > 65535) {
|
| - printer->Print(
|
| - "static const char descriptor[] = {\n");
|
| - printer->Indent();
|
| -
|
| - // Only write 25 bytes per line.
|
| - static const int kBytesPerLine = 25;
|
| - for (int i = 0; i < file_data.size();) {
|
| - for (int j = 0; j < kBytesPerLine && i < file_data.size(); ++i, ++j) {
|
| - printer->Print(
|
| - "$char$, ",
|
| - "char", SimpleItoa(file_data[i]));
|
| - }
|
| - printer->Print(
|
| - "\n");
|
| - }
|
| -
|
| - printer->Outdent();
|
| - printer->Print(
|
| - "};\n");
|
| -
|
| - printer->Print(
|
| - "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(descriptor, $size$);\n",
|
| - "size", SimpleItoa(file_data.size()));
|
| -
|
| - } else {
|
| -
|
| - printer->Print(
|
| - "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(");
|
| -
|
| - // Only write 40 bytes per line.
|
| - static const int kBytesPerLine = 40;
|
| - for (int i = 0; i < file_data.size(); i += kBytesPerLine) {
|
| - printer->Print("\n \"$data$\"",
|
| - "data",
|
| - EscapeTrigraphs(
|
| - CEscape(file_data.substr(i, kBytesPerLine))));
|
| - }
|
| - printer->Print(
|
| - ", $size$);\n",
|
| - "size", SimpleItoa(file_data.size()));
|
| -
|
| + printer->Print(
|
| + "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(");
|
| +
|
| + // Only write 40 bytes per line.
|
| + static const int kBytesPerLine = 40;
|
| + for (int i = 0; i < file_data.size(); i += kBytesPerLine) {
|
| + printer->Print("\n \"$data$\"",
|
| + "data",
|
| + EscapeTrigraphs(
|
| + CEscape(file_data.substr(i, kBytesPerLine))));
|
| }
|
| + printer->Print(
|
| + ", $size$);\n",
|
| + "size", SimpleItoa(file_data.size()));
|
|
|
| // Call MessageFactory::InternalRegisterGeneratedFile().
|
| printer->Print(
|
| @@ -548,294 +651,6 @@ void FileGenerator::GenerateNamespaceClosers(io::Printer* printer) {
|
| }
|
| }
|
|
|
| -void FileGenerator::GenerateTopHeaderGuard(io::Printer* printer) {
|
| - string filename_identifier = FilenameIdentifier(file_->name());
|
| - // Generate top of header.
|
| - printer->Print(
|
| - "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
|
| - "// source: $filename$\n"
|
| - "\n"
|
| - "#ifndef PROTOBUF_$filename_identifier$__INCLUDED\n"
|
| - "#define PROTOBUF_$filename_identifier$__INCLUDED\n"
|
| - "\n"
|
| - "#include <string>\n"
|
| - "\n",
|
| - "filename", file_->name(),
|
| - "filename_identifier", filename_identifier);
|
| -}
|
| -
|
| -void FileGenerator::GenerateBottomHeaderGuard(io::Printer* printer) {
|
| - string filename_identifier = FilenameIdentifier(file_->name());
|
| - printer->Print(
|
| - "#endif // PROTOBUF_$filename_identifier$__INCLUDED\n",
|
| - "filename_identifier", filename_identifier);
|
| -}
|
| -
|
| -void FileGenerator::GenerateLibraryIncludes(io::Printer* printer) {
|
| -
|
| - printer->Print(
|
| - "#include <google/protobuf/stubs/common.h>\n"
|
| - "\n");
|
| -
|
| - // Verify the protobuf library header version is compatible with the protoc
|
| - // version before going any further.
|
| - printer->Print(
|
| - "#if GOOGLE_PROTOBUF_VERSION < $min_header_version$\n"
|
| - "#error This file was generated by a newer version of protoc which is\n"
|
| - "#error incompatible with your Protocol Buffer headers. Please update\n"
|
| - "#error your headers.\n"
|
| - "#endif\n"
|
| - "#if $protoc_version$ < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION\n"
|
| - "#error This file was generated by an older version of protoc which is\n"
|
| - "#error incompatible with your Protocol Buffer headers. Please\n"
|
| - "#error regenerate this file with a newer version of protoc.\n"
|
| - "#endif\n"
|
| - "\n",
|
| - "min_header_version",
|
| - SimpleItoa(protobuf::internal::kMinHeaderVersionForProtoc),
|
| - "protoc_version", SimpleItoa(GOOGLE_PROTOBUF_VERSION));
|
| -
|
| - // OK, it's now safe to #include other files.
|
| - printer->Print(
|
| - "#include <google/protobuf/arena.h>\n"
|
| - "#include <google/protobuf/arenastring.h>\n"
|
| - "#include <google/protobuf/generated_message_util.h>\n");
|
| - if (UseUnknownFieldSet(file_)) {
|
| - printer->Print(
|
| - "#include <google/protobuf/metadata.h>\n");
|
| - }
|
| - if (file_->message_type_count() > 0) {
|
| - if (HasDescriptorMethods(file_)) {
|
| - printer->Print(
|
| - "#include <google/protobuf/message.h>\n");
|
| - } else {
|
| - printer->Print(
|
| - "#include <google/protobuf/message_lite.h>\n");
|
| - }
|
| - }
|
| - printer->Print(
|
| - "#include <google/protobuf/repeated_field.h>\n"
|
| - "#include <google/protobuf/extension_set.h>\n");
|
| - if (HasMapFields(file_)) {
|
| - printer->Print(
|
| - "#include <google/protobuf/map.h>\n");
|
| - if (HasDescriptorMethods(file_)) {
|
| - printer->Print(
|
| - "#include <google/protobuf/map_field_inl.h>\n");
|
| - } else {
|
| - printer->Print(
|
| - "#include <google/protobuf/map_field_lite.h>\n");
|
| - }
|
| - }
|
| -
|
| - if (HasEnumDefinitions(file_)) {
|
| - if (HasDescriptorMethods(file_)) {
|
| - printer->Print(
|
| - "#include <google/protobuf/generated_enum_reflection.h>\n");
|
| - } else {
|
| - printer->Print(
|
| - "#include <google/protobuf/generated_enum_util.h>\n");
|
| - }
|
| - }
|
| -
|
| - if (HasGenericServices(file_)) {
|
| - printer->Print(
|
| - "#include <google/protobuf/service.h>\n");
|
| - }
|
| -
|
| - if (UseUnknownFieldSet(file_) && file_->message_type_count() > 0) {
|
| - printer->Print(
|
| - "#include <google/protobuf/unknown_field_set.h>\n");
|
| - }
|
| -
|
| -
|
| - if (IsAnyMessage(file_)) {
|
| - printer->Print(
|
| - "#include \"google/protobuf/any.h\"\n");
|
| - }
|
| -}
|
| -
|
| -void FileGenerator::GenerateDependencyIncludes(io::Printer* printer) {
|
| - set<string> public_import_names;
|
| - for (int i = 0; i < file_->public_dependency_count(); i++) {
|
| - public_import_names.insert(file_->public_dependency(i)->name());
|
| - }
|
| -
|
| - for (int i = 0; i < file_->dependency_count(); i++) {
|
| - const string& name = file_->dependency(i)->name();
|
| - bool public_import = (public_import_names.count(name) != 0);
|
| -
|
| -
|
| - printer->Print(
|
| - "#include \"$dependency$.pb.h\"$iwyu$\n",
|
| - "dependency", StripProto(name),
|
| - "iwyu", (public_import) ? " // IWYU pragma: export" : "");
|
| - }
|
| -}
|
| -
|
| -void FileGenerator::GenerateGlobalStateFunctionDeclarations(
|
| - io::Printer* printer) {
|
| - // Forward-declare the AddDescriptors, AssignDescriptors, and ShutdownFile
|
| - // functions, so that we can declare them to be friends of each class.
|
| - printer->Print(
|
| - "\n"
|
| - "// Internal implementation detail -- do not call these.\n"
|
| - "void $dllexport_decl$$adddescriptorsname$();\n",
|
| - "adddescriptorsname", GlobalAddDescriptorsName(file_->name()),
|
| - "dllexport_decl",
|
| - options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " ");
|
| -
|
| - printer->Print(
|
| - // Note that we don't put dllexport_decl on these because they are only
|
| - // called by the .pb.cc file in which they are defined.
|
| - "void $assigndescriptorsname$();\n"
|
| - "void $shutdownfilename$();\n"
|
| - "\n",
|
| - "assigndescriptorsname", GlobalAssignDescriptorsName(file_->name()),
|
| - "shutdownfilename", GlobalShutdownFileName(file_->name()));
|
| -}
|
| -
|
| -void FileGenerator::GenerateMessageForwardDeclarations(io::Printer* printer) {
|
| - // Generate forward declarations of classes.
|
| - for (int i = 0; i < file_->message_type_count(); i++) {
|
| - message_generators_[i]->GenerateMessageForwardDeclaration(printer);
|
| - }
|
| -}
|
| -
|
| -void FileGenerator::GenerateMessageDefinitions(io::Printer* printer) {
|
| - // Generate class definitions.
|
| - for (int i = 0; i < file_->message_type_count(); i++) {
|
| - if (i > 0) {
|
| - printer->Print("\n");
|
| - printer->Print(kThinSeparator);
|
| - printer->Print("\n");
|
| - }
|
| - message_generators_[i]->GenerateClassDefinition(printer);
|
| - }
|
| -}
|
| -
|
| -void FileGenerator::GenerateEnumDefinitions(io::Printer* printer) {
|
| - // Generate enum definitions.
|
| - for (int i = 0; i < file_->message_type_count(); i++) {
|
| - message_generators_[i]->GenerateEnumDefinitions(printer);
|
| - }
|
| - for (int i = 0; i < file_->enum_type_count(); i++) {
|
| - enum_generators_[i]->GenerateDefinition(printer);
|
| - }
|
| -}
|
| -
|
| -void FileGenerator::GenerateServiceDefinitions(io::Printer* printer) {
|
| - if (HasGenericServices(file_)) {
|
| - // Generate service definitions.
|
| - for (int i = 0; i < file_->service_count(); i++) {
|
| - if (i > 0) {
|
| - printer->Print("\n");
|
| - printer->Print(kThinSeparator);
|
| - printer->Print("\n");
|
| - }
|
| - service_generators_[i]->GenerateDeclarations(printer);
|
| - }
|
| -
|
| - printer->Print("\n");
|
| - printer->Print(kThickSeparator);
|
| - printer->Print("\n");
|
| - }
|
| -}
|
| -
|
| -void FileGenerator::GenerateExtensionIdentifiers(io::Printer* printer) {
|
| - // Declare extension identifiers.
|
| - for (int i = 0; i < file_->extension_count(); i++) {
|
| - extension_generators_[i]->GenerateDeclaration(printer);
|
| - }
|
| -}
|
| -
|
| -void FileGenerator::GenerateInlineFunctionDefinitions(io::Printer* printer) {
|
| - // An aside about inline functions in .proto.h mode:
|
| - //
|
| - // The PROTOBUF_INLINE_NOT_IN_HEADERS symbol controls conditionally
|
| - // moving much of the inline functions to the .pb.cc file, which can be a
|
| - // significant performance benefit for compilation time, at the expense
|
| - // of non-inline function calls.
|
| - //
|
| - // However, in .proto.h mode, the definition of the internal dependent
|
| - // base class must remain in the header, and can never be out-lined. The
|
| - // dependent base class also needs access to has-bit manipuation
|
| - // functions, so the has-bit functions must be unconditionally inlined in
|
| - // proto_h mode.
|
| - //
|
| - // This gives us three flavors of functions:
|
| - //
|
| - // 1. Functions on the message not used by the internal dependent base
|
| - // class: in .proto.h mode, only some functions are defined on the
|
| - // message class; others are defined on the dependent base class.
|
| - // These are guarded and can be out-lined. These are generated by
|
| - // GenerateInlineMethods, and include has_* bit functions in
|
| - // non-proto_h mode.
|
| - //
|
| - // 2. Functions on the internal dependent base class: these functions
|
| - // are dependent on a template parameter, so they always need to
|
| - // remain in the header.
|
| - //
|
| - // 3. Functions on the message that are used by the dependent base: the
|
| - // dependent base class down casts itself to the message
|
| - // implementation class to access these functions (the has_* bit
|
| - // manipulation functions). Unlike #1, these functions must
|
| - // unconditionally remain in the header. These are emitted by
|
| - // GenerateDependentInlineMethods, even though they are not actually
|
| - // dependent.
|
| -
|
| - printer->Print("#if !PROTOBUF_INLINE_NOT_IN_HEADERS\n");
|
| - // Generate class inline methods.
|
| - for (int i = 0; i < file_->message_type_count(); i++) {
|
| - if (i > 0) {
|
| - printer->Print(kThinSeparator);
|
| - printer->Print("\n");
|
| - }
|
| - message_generators_[i]->GenerateInlineMethods(printer,
|
| - /* is_inline = */ true);
|
| - }
|
| - printer->Print("#endif // !PROTOBUF_INLINE_NOT_IN_HEADERS\n");
|
| -
|
| - for (int i = 0; i < file_->message_type_count(); i++) {
|
| - if (i > 0) {
|
| - printer->Print(kThinSeparator);
|
| - printer->Print("\n");
|
| - }
|
| - // Methods of the dependent base class must always be inline in the header.
|
| - message_generators_[i]->GenerateDependentInlineMethods(printer);
|
| - }
|
| -
|
| - printer->Print(
|
| - "\n"
|
| - "// @@protoc_insertion_point(namespace_scope)\n");
|
| -}
|
| -
|
| -void FileGenerator::GenerateProto2NamespaceEnumSpecializations(
|
| - io::Printer* printer) {
|
| - // Emit GetEnumDescriptor specializations into google::protobuf namespace:
|
| - if (HasEnumDefinitions(file_)) {
|
| - // The SWIG conditional is to avoid a null-pointer dereference
|
| - // (bug 1984964) in swig-1.3.21 resulting from the following syntax:
|
| - // namespace X { void Y<Z::W>(); }
|
| - // which appears in GetEnumDescriptor() specializations.
|
| - printer->Print(
|
| - "\n"
|
| - "#ifndef SWIG\n"
|
| - "namespace google {\nnamespace protobuf {\n"
|
| - "\n");
|
| - for (int i = 0; i < file_->message_type_count(); i++) {
|
| - message_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
|
| - }
|
| - for (int i = 0; i < file_->enum_type_count(); i++) {
|
| - enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
|
| - }
|
| - printer->Print(
|
| - "\n"
|
| - "} // namespace protobuf\n} // namespace google\n"
|
| - "#endif // SWIG\n");
|
| - }
|
| -}
|
| -
|
| } // namespace cpp
|
| } // namespace compiler
|
| } // namespace protobuf
|
|
|