[ObjC] Go back from Printer::Emit() to Printer::Print()
PiperOrigin-RevId: 492559629
diff --git a/src/google/protobuf/compiler/objectivec/file.cc b/src/google/protobuf/compiler/objectivec/file.cc
index 887f81b..2d7b5bb 100644
--- a/src/google/protobuf/compiler/objectivec/file.cc
+++ b/src/google/protobuf/compiler/objectivec/file.cc
@@ -44,6 +44,7 @@
#include "absl/container/btree_set.h"
#include "absl/container/flat_hash_map.h"
#include "absl/container/flat_hash_set.h"
+#include "absl/strings/str_cat.h"
#include "absl/strings/str_join.h"
#include "google/protobuf/compiler/objectivec/enum.h"
#include "google/protobuf/compiler/objectivec/extension.h"
@@ -240,92 +241,71 @@
void FileGenerator::GenerateHeader(io::Printer* p) const {
GenerateFile(p, GeneratedFileType::kHeader, [&] {
- p->Emit(
- {
- {"fwd_decls",
- [&] {
- absl::btree_set<std::string> fwd_decls;
- for (const auto& generator : message_generators_) {
- generator->DetermineForwardDeclarations(
- &fwd_decls,
- /* include_external_types = */
- HeadersUseForwardDeclarations());
- }
+ p->Print("CF_EXTERN_C_BEGIN\n\n");
- if (!fwd_decls.empty()) {
- p->Emit({{"decls", absl::StrJoin(fwd_decls, "\n")}},
- R"objc(
- $decls$
+ absl::btree_set<std::string> fwd_decls;
+ for (const auto& generator : message_generators_) {
+ generator->DetermineForwardDeclarations(&fwd_decls,
+ /* include_external_types = */
+ HeadersUseForwardDeclarations());
+ }
+ if (!fwd_decls.empty()) {
+ p->Print("$fwd_decls$\n\n", "fwd_decls", absl::StrJoin(fwd_decls, "\n"));
+ }
- )objc");
- }
- }},
- {"enums",
- [&] {
- for (const auto& generator : enum_generators_) {
- generator->GenerateHeader(p);
- }
- }},
- {"root_extensions",
- [&] {
- // The dynamic methods block is only needed if there are
- // extensions that are file level scoped (not message scoped).
- // The first file_->extension_count() of extension_generators_
- // are the file scoped ones.
- if (file_->extension_count()) {
- p->Emit(
- {
- {"extension_methods",
- [&] {
- for (int i = 0; i < file_->extension_count(); i++) {
- extension_generators_[i]->GenerateMembersHeader(
- p);
- }
- }},
- },
- R"objc(
- @interface $root_class_name$ (DynamicMethods)
- $extension_methods$;
- @end
+ p->Print("NS_ASSUME_NONNULL_BEGIN\n\n");
- )objc");
- } // file_->extension_count()
- }},
- {"messages",
- [&] {
- for (const auto& generator : message_generators_) {
- generator->GenerateMessageHeader(p);
- }
- }},
- },
- R"objc(
- CF_EXTERN_C_BEGIN
+ for (const auto& generator : enum_generators_) {
+ generator->GenerateHeader(p);
+ }
- $fwd_decls$;
- NS_ASSUME_NONNULL_BEGIN
+ // For extensions to chain together, the Root gets created even if there
+ // are no extensions.
+ p->Print(
+ // clang-format off
+ "#pragma mark - $root_class_name$\n"
+ "\n"
+ "/**\n"
+ " * Exposes the extension registry for this file.\n"
+ " *\n"
+ " * The base class provides:\n"
+ " * @code\n"
+ " * + (GPBExtensionRegistry *)extensionRegistry;\n"
+ " * @endcode\n"
+ " * which is a @c GPBExtensionRegistry that includes all the extensions defined by\n"
+ " * this file and all files that it depends on.\n"
+ " **/\n"
+ "GPB_FINAL @interface $root_class_name$ : GPBRootObject\n"
+ "@end\n"
+ "\n",
+ // clang-format on
+ "root_class_name", root_class_name_);
- $enums$;
- #pragma mark - $root_class_name$
+ // The dynamic methods block is only needed if there are extensions that are
+ // file level scoped (not message scoped). The first
+ // file_->extension_count() of extension_generators_ are the file scoped
+ // ones.
+ if (file_->extension_count()) {
+ p->Print("@interface $root_class_name$ (DynamicMethods)\n",
+ "root_class_name", root_class_name_);
- /**
- * Exposes the extension registry for this file.
- *
- * The base class provides:
- * @code
- * + (GPBExtensionRegistry *)extensionRegistry;
- * @endcode
- * which is a @c GPBExtensionRegistry that includes all the extensions defined by
- * this file and all files that it depends on.
- **/
- GPB_FINAL @interface $root_class_name$ : GPBRootObject
- @end
+ for (int i = 0; i < file_->extension_count(); i++) {
+ extension_generators_[i]->GenerateMembersHeader(p);
+ }
- $root_extensions$;
- $messages$;
- NS_ASSUME_NONNULL_END
+ p->Print("@end\n\n");
+ } // file_->extension_count()
- CF_EXTERN_C_END
- )objc");
+ for (const auto& generator : message_generators_) {
+ generator->GenerateMessageHeader(p);
+ }
+
+ // clang-format off
+ p->Print(
+ "NS_ASSUME_NONNULL_END\n"
+ "\n"
+ "CF_EXTERN_C_END\n");
+ // clang-format on
});
}
@@ -368,44 +348,28 @@
GenerateFile(
p, GeneratedFileType::kSource, ignored_warnings, extra_files, [&] {
- p->Emit(
- {
- {"fwd_decls",
- [&] {
- if (fwd_decls.empty()) {
- return;
- }
- p->Emit({{"decls", absl::StrJoin(fwd_decls, "\n")}},
- R"objc(
- #pragma mark - Objective C Class declarations
- // Forward declarations of Objective C classes that we can use as
- // static values in struct initializers.
- // We don't use [Foo class] because it is not a static value.
- $decls$
+ if (!fwd_decls.empty()) {
+ p->Print(
+ // clang-format off
+ "#pragma mark - Objective C Class declarations\n"
+ "// Forward declarations of Objective C classes that we can use as\n"
+ "// static values in struct initializers.\n"
+ "// We don't use [Foo class] because it is not a static value.\n"
+ "$fwd_decls$\n"
+ "\n",
+ // clang-format on
+ "fwd_decls", absl::StrJoin(fwd_decls, "\n"));
+ }
- )objc");
- }},
- {"root_implementation",
- [&] { EmitRootImplementation(p, deps_with_extensions); }},
- {"file_descriptor_implementation",
- [&] { EmitFileDescriptorImplementation(p); }},
- {"enums_and_messages",
- [&] {
- for (const auto& generator : enum_generators_) {
- generator->GenerateSource(p);
- }
- for (const auto& generator : message_generators_) {
- generator->GenerateSource(p);
- }
- }},
- },
- R"objc(
- $fwd_decls$;
- $root_implementation$
+ PrintRootImplementation(p, deps_with_extensions);
+ PrintFileDescriptorImplementation(p);
- $file_descriptor_implementation$;
- $enums_and_messages$;
- )objc");
+ for (const auto& generator : enum_generators_) {
+ generator->GenerateSource(p);
+ }
+ for (const auto& generator : message_generators_) {
+ generator->GenerateSource(p);
+ }
});
}
@@ -468,245 +432,222 @@
import_writer.AddFile(dep, header_extension);
}
- p->Emit(
- {
- // Avoid the directive within the string below being seen by the
- // tool.
- {"clangfmt", "clang-format"},
- {"filename", file_->name()},
- {"root_class_name", root_class_name_},
- {"source_check",
- [&] {
- if (file_type == GeneratedFileType::kHeader) {
- // Add some verification that the generated code matches the
- // source the code is being compiled with.
- //
- // NOTE: Where used, this captures the raw numeric values at the
- // time the generator was compiled, since that will be the
- // versions for the ObjC runtime at that time. The constants in
- // the generated code will then get their values at at compile
- // time (so checking against the headers being used to compile).
- p->Emit({{"google_protobuf_objc_version",
- GOOGLE_PROTOBUF_OBJC_VERSION}},
- R"objc(
- #if GOOGLE_PROTOBUF_OBJC_VERSION < $google_protobuf_objc_version$
- #error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.
- #endif
- #if $google_protobuf_objc_version$ < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION
- #error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.
- #endif
+ p->Print(
+ "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
+ "// $clangfmt$ off\n"
+ "// source: $filename$\n"
+ "\n",
+ "filename", file_->name(), "clangfmt", "clang-format");
- )objc");
- }
- }},
- {"runtime_imports",
- [&] {
- import_writer.EmitRuntimeImports(
- p, /* default_cpp_symbol = */ !is_bundled_proto_);
- }},
- {"file_imports", [&] { import_writer.EmitFileImports(p); }},
- {"extra_imports",
- [&] {
- // Enum implementation uses atomic in the generated code, so add
- // the system import as needed.
- if (file_type == GeneratedFileType::kSource &&
- !enum_generators_.empty()) {
- p->Emit("#import <stdatomic.h>\n\n");
- }
- }},
- {"extra_warnings",
- [&] {
- for (const auto& warning : ignored_warnings) {
- p->Emit({{"warning", warning}},
- R"objc(
- #pragma clang diagnostic ignored "-W$warning$"
- )objc");
- }
- }},
- {"body", body},
- },
- R"objc(
- // Generated by the protocol buffer compiler. DO NOT EDIT!
- // $clangfmt$ off
- // source: $filename$
+ import_writer.PrintRuntimeImports(
+ p, /* default_cpp_symbol = */ !is_bundled_proto_);
- $runtime_imports$
+ p->Print("\n");
- $source_check$;
- $extra_imports$;
- $file_imports$
- // @@protoc_insertion_point(imports)
+ if (file_type == GeneratedFileType::kHeader) {
+ // Add some verification that the generated code matches the source the
+ // code is being compiled with.
+ // NOTE: This captures the raw numeric values at the time the generator was
+ // compiled, since that will be the versions for the ObjC runtime at that
+ // time. The constants in the generated code will then get their values at
+ // at compile time (so checking against the headers being used to compile).
+ p->Print(
+ // clang-format off
+ "#if GOOGLE_PROTOBUF_OBJC_VERSION < $google_protobuf_objc_version$\n"
+ "#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.\n"
+ "#endif\n"
+ "#if $google_protobuf_objc_version$ < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION\n"
+ "#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.\n"
+ "#endif\n"
+ "\n",
+ // clang-format on
+ "google_protobuf_objc_version",
+ absl::StrCat(GOOGLE_PROTOBUF_OBJC_VERSION));
+ }
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
- $extra_warnings$;
+ // Enum implementation uses atomic in the generated code, so add
+ // the system import as needed.
+ if (file_type == GeneratedFileType::kSource && !enum_generators_.empty()) {
+ p->Print("#import <stdatomic.h>\n\n");
+ }
- $body$;
+ import_writer.PrintFileImports(p);
- #pragma clang diagnostic pop
+ // clang-format off
+ p->Print(
+ "// @@protoc_insertion_point(imports)\n"
+ "\n"
+ "#pragma clang diagnostic push\n"
+ "#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n");
+ // clang-format on
+ for (const auto& warning : ignored_warnings) {
+ p->Print("#pragma clang diagnostic ignored \"-W$warning$\"\n", "warning",
+ warning);
+ }
+ p->Print("\n");
- // @@protoc_insertion_point(global_scope)
+ body();
- // $clangfmt$ on
- )objc");
+ p->Print(
+ "\n"
+ "#pragma clang diagnostic pop\n"
+ "\n"
+ "// @@protoc_insertion_point(global_scope)\n"
+ "\n"
+ "// $clangfmt$ on\n",
+ "clangfmt", "clang-format");
}
-void FileGenerator::EmitRootImplementation(
+void FileGenerator::PrintRootImplementation(
io::Printer* p,
const std::vector<const FileDescriptor*>& deps_with_extensions) const {
- p->Emit(
- {
- {"root_extension_registry",
- [&] {
- // If there were any extensions or this file has any dependencies,
- // output a registry to override to create the file specific
- // registry.
- if (extension_generators_.empty() &&
- deps_with_extensions.empty()) {
- if (file_->dependency_count() == 0) {
- p->Emit(R"objc(
- // No extensions in the file and no imports, so no need to generate
- // +extensionRegistry.
- )objc");
- } else {
- p->Emit(R"objc(
- // No extensions in the file and none of the imports (direct or indirect)
- // defined extensions, so no need to generate +extensionRegistry.
- )objc");
- }
- } else {
- EmitRootExtensionRegistryImplementation(p, deps_with_extensions);
- }
- }},
- },
- R"objc(
- #pragma mark - $root_class_name$
+ p->Print(
+ // clang-format off
+ "#pragma mark - $root_class_name$\n"
+ "\n"
+ "@implementation $root_class_name$\n"
+ "\n",
+ // clang-format on
+ "root_class_name", root_class_name_);
- @implementation $root_class_name$
+ // If there were any extensions or this file has any dependencies, output a
+ // registry to override to create the file specific registry.
+ if (extension_generators_.empty() && deps_with_extensions.empty()) {
+ if (file_->dependency_count() == 0) {
+ // clang-format off
+ p->Print(
+ "// No extensions in the file and no imports, so no need to generate\n"
+ "// +extensionRegistry.\n");
+ // clang-format on
+ } else {
+ // clang-format off
+ p->Print(
+ "// No extensions in the file and none of the imports (direct or indirect)\n"
+ "// defined extensions, so no need to generate +extensionRegistry.\n");
+ // clang-format on
+ }
+ } else {
+ PrintRootExtensionRegistryImplementation(p, deps_with_extensions);
+ }
- $root_extension_registry$
-
- @end
- )objc");
+ p->Print("\n@end\n\n");
}
-void FileGenerator::EmitRootExtensionRegistryImplementation(
+void FileGenerator::PrintRootExtensionRegistryImplementation(
io::Printer* p,
const std::vector<const FileDescriptor*>& deps_with_extensions) const {
- p->Emit(
- {
- {"register_local_extensions",
- [&] {
- if (extension_generators_.empty()) {
- return;
- }
- p->Emit(R"objc(
- static GPBExtensionDescription descriptions[] = {
- $register_local_extensions_variable_blocks$
- };
- for (size_t i = 0; i < sizeof(descriptions) / sizeof(descriptions[0]); ++i) {
- GPBExtensionDescriptor *extension =
- [[GPBExtensionDescriptor alloc] initWithExtensionDescription:&descriptions[i]
- usesClassRefs:YES];
- [registry addExtension:extension];
- [self globallyRegisterExtension:extension];
- [extension release];
- }
- )objc");
- }},
- {"register_local_extensions_variable_blocks",
- [&] {
- for (const auto& generator : extension_generators_) {
- generator->GenerateStaticVariablesInitialization(p);
- }
- }},
- {"register_imports",
- [&] {
- if (deps_with_extensions.empty()) {
- p->Emit(R"objc(
- // None of the imports (direct or indirect) defined extensions, so no need to add
- // them to this registry.
- )objc");
- } else {
- p->Emit(R"objc(
- // Merge in the imports (direct or indirect) that defined extensions.
- )objc");
- for (const auto& dep : deps_with_extensions) {
- p->Emit({{"dependency", FileClassName(dep)}},
- R"objc(
- [registry addExtensions:[$dependency$ extensionRegistry]];
- )objc");
- }
- }
- }},
- },
- R"objc(
- + (GPBExtensionRegistry*)extensionRegistry {
- // This is called by +initialize so there is no need to worry
- // about thread safety and initialization of registry.
- static GPBExtensionRegistry* registry = nil;
- if (!registry) {
- GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
- registry = [[GPBExtensionRegistry alloc] init];
- $register_local_extensions$;
- $register_imports$
- }
- return registry;
- }
- )objc");
+ // clang-format off
+ p->Print(
+ "+ (GPBExtensionRegistry*)extensionRegistry {\n"
+ " // This is called by +initialize so there is no need to worry\n"
+ " // about thread safety and initialization of registry.\n"
+ " static GPBExtensionRegistry* registry = nil;\n"
+ " if (!registry) {\n"
+ " GPB_DEBUG_CHECK_RUNTIME_VERSIONS();\n"
+ " registry = [[GPBExtensionRegistry alloc] init];\n");
+ // clang-format on
+
+ p->Indent();
+ p->Indent();
+
+ if (!extension_generators_.empty()) {
+ p->Print("static GPBExtensionDescription descriptions[] = {\n");
+ p->Indent();
+ for (const auto& generator : extension_generators_) {
+ generator->GenerateStaticVariablesInitialization(p);
+ }
+ p->Outdent();
+ // clang-format off
+ p->Print(
+ "};\n"
+ "for (size_t i = 0; i < sizeof(descriptions) / sizeof(descriptions[0]); ++i) {\n"
+ " GPBExtensionDescriptor *extension =\n"
+ " [[GPBExtensionDescriptor alloc] initWithExtensionDescription:&descriptions[i]\n"
+ " usesClassRefs:YES];\n"
+ " [registry addExtension:extension];\n"
+ " [self globallyRegisterExtension:extension];\n"
+ " [extension release];\n"
+ "}\n");
+ // clang-format on
+ }
+
+ if (deps_with_extensions.empty()) {
+ // clang-format off
+ p->Print(
+ "// None of the imports (direct or indirect) defined extensions, so no need to add\n"
+ "// them to this registry.\n");
+ // clang-format on
+ } else {
+ // clang-format off
+ p->Print(
+ "// Merge in the imports (direct or indirect) that defined extensions.\n");
+ // clang-format on
+ for (const auto& dep : deps_with_extensions) {
+ const std::string root_class_name(FileClassName((dep)));
+ p->Print("[registry addExtensions:[$dependency$ extensionRegistry]];\n",
+ "dependency", root_class_name);
+ }
+ }
+
+ p->Outdent();
+ p->Outdent();
+
+ // clang-format off
+ p->Print(
+ " }\n"
+ " return registry;\n"
+ "}\n");
+ // clang-format on
}
-void FileGenerator::EmitFileDescriptorImplementation(io::Printer* p) const {
+void FileGenerator::PrintFileDescriptorImplementation(io::Printer* p) const {
// File descriptor only needed if there are messages to use it.
if (message_generators_.empty()) {
return;
}
- std::string syntax;
+ const std::string objc_prefix(FileClassPrefix(file_));
+ absl::flat_hash_map<absl::string_view, std::string> vars;
+ vars["root_class_name"] = root_class_name_;
+ vars["package"] = file_->package();
switch (file_->syntax()) {
case FileDescriptor::SYNTAX_UNKNOWN:
- syntax = "GPBFileSyntaxUnknown";
+ vars["syntax"] = "GPBFileSyntaxUnknown";
break;
case FileDescriptor::SYNTAX_PROTO2:
- syntax = "GPBFileSyntaxProto2";
+ vars["syntax"] = "GPBFileSyntaxProto2";
break;
case FileDescriptor::SYNTAX_PROTO3:
- syntax = "GPBFileSyntaxProto3";
+ vars["syntax"] = "GPBFileSyntaxProto3";
break;
}
- const std::string objc_prefix(FileClassPrefix(file_));
+ if (objc_prefix.empty()) {
+ vars["prefix_arg"] = "";
+ } else {
+ vars["prefix_arg"] = absl::StrCat(
+ " objcPrefix:@\"",
+ objc_prefix, "\"\n");
+ }
- p->Emit(
- {
- {"package", file_->package()},
- {"objc_prefix", objc_prefix},
- {"objc_prefix_arg",
- [&] {
- if (!objc_prefix.empty()) {
- p->Emit(R"objc(
- objcPrefix:@"$objc_prefix$"
- )objc");
- }
- }},
- {"syntax", syntax},
- },
- R"objc(
- #pragma mark - $root_class_name$_FileDescriptor
-
- static GPBFileDescriptor *$root_class_name$_FileDescriptor(void) {
- // This is called by +initialize so there is no need to worry
- // about thread safety of the singleton.
- static GPBFileDescriptor *descriptor = NULL;
- if (!descriptor) {
- GPB_DEBUG_CHECK_RUNTIME_VERSIONS();
- descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"$package$"
- $objc_prefix_arg$;
- syntax:$syntax$];
- }
- return descriptor;
- }
-
- )objc");
+ // clang-format off
+ p->Print(
+ vars,
+ "#pragma mark - $root_class_name$_FileDescriptor\n"
+ "\n"
+ "static GPBFileDescriptor *$root_class_name$_FileDescriptor(void) {\n"
+ " // This is called by +initialize so there is no need to worry\n"
+ " // about thread safety of the singleton.\n"
+ " static GPBFileDescriptor *descriptor = NULL;\n"
+ " if (!descriptor) {\n"
+ " GPB_DEBUG_CHECK_RUNTIME_VERSIONS();\n"
+ " descriptor = [[GPBFileDescriptor alloc] initWithPackage:@\"$package$\"\n"
+ "$prefix_arg$"
+ " syntax:$syntax$];\n"
+ " }\n"
+ " return descriptor;\n"
+ "}\n"
+ "\n");
+ // clang-format on
}
} // namespace objectivec
diff --git a/src/google/protobuf/compiler/objectivec/file.h b/src/google/protobuf/compiler/objectivec/file.h
index a6bed27..f6d3879 100644
--- a/src/google/protobuf/compiler/objectivec/file.h
+++ b/src/google/protobuf/compiler/objectivec/file.h
@@ -95,13 +95,13 @@
GenerateFile(p, file_type, {}, {}, body);
}
- void EmitRootImplementation(
+ void PrintRootImplementation(
io::Printer* p,
const std::vector<const FileDescriptor*>& deps_with_extensions) const;
- void EmitRootExtensionRegistryImplementation(
+ void PrintRootExtensionRegistryImplementation(
io::Printer* p,
const std::vector<const FileDescriptor*>& deps_with_extensions) const;
- void EmitFileDescriptorImplementation(io::Printer* p) const;
+ void PrintFileDescriptorImplementation(io::Printer* p) const;
bool HeadersUseForwardDeclarations() const {
// The bundled protos (WKTs) don't make use of forward declarations.
diff --git a/src/google/protobuf/compiler/objectivec/import_writer.cc b/src/google/protobuf/compiler/objectivec/import_writer.cc
index eef7636..63a8a04 100644
--- a/src/google/protobuf/compiler/objectivec/import_writer.cc
+++ b/src/google/protobuf/compiler/objectivec/import_writer.cc
@@ -166,125 +166,70 @@
protobuf_imports_.push_back(header_name);
}
-void ImportWriter::EmitFileImports(io::Printer* p) const {
- p->Emit(
- {
- {"other_framework_imports",
- [&] {
- for (const auto& header : other_framework_imports_) {
- p->Emit({{"header", header}},
- R"objc(
- #import <$header$>
- )objc");
- }
- }},
- {"other_imports",
- [&] {
- for (const auto& header : other_imports_) {
- p->Emit({{"header", header}},
- R"objc(
- #import "$header$"
- )objc");
- }
- }},
- },
- R"objc(
- $other_framework_imports$;
- $other_imports$;
- )objc");
+void ImportWriter::PrintFileImports(io::Printer* p) const {
+ if (!other_framework_imports_.empty()) {
+ for (const auto& header : other_framework_imports_) {
+ p->Print("#import <$header$>\n", "header", header);
+ }
+ }
+
+ if (!other_imports_.empty()) {
+ if (!other_framework_imports_.empty()) {
+ p->Print("\n");
+ }
+
+ for (const auto& header : other_imports_) {
+ p->Print("#import \"$header$\"\n", "header", header);
+ }
+ }
}
-void ImportWriter::EmitRuntimeImports(io::Printer* p,
- bool default_cpp_symbol) const {
+void ImportWriter::PrintRuntimeImports(io::Printer* p,
+ bool default_cpp_symbol) const {
// Given an override, use that.
if (!runtime_import_prefix_.empty()) {
- p->Emit(
- {
- {"import_prefix", runtime_import_prefix_},
- {"imports",
- [&] {
- for (const auto& header : protobuf_imports_) {
- p->Emit({{"header", header}},
- R"objc(
- #import "$import_prefix$/$header$"
- )objc");
- }
- }},
- },
- R"objc(
- $imports$
- )objc");
-
+ for (const auto& header : protobuf_imports_) {
+ p->Print("#import \"$import_prefix$/$header$\"\n", "header", header,
+ "import_prefix", runtime_import_prefix_);
+ }
return;
}
// If bundled, no need to do the framework support below.
if (for_bundled_proto_) {
GOOGLE_DCHECK(!default_cpp_symbol);
- p->Emit(
- {
- {"imports",
- [&] {
- for (const auto& header : protobuf_imports_) {
- p->Emit({{"header", header}},
- R"objc(
- #import "$header$"
- )objc");
- }
- }},
- },
- R"objc(
- $imports$
- )objc");
+ for (const auto& header : protobuf_imports_) {
+ p->Print("#import \"$header$\"\n", "header", header);
+ }
return;
}
- auto v = p->WithVars({
- {"cpp_symbol",
- ProtobufFrameworkImportSymbol(ProtobufLibraryFrameworkName)},
- });
+ const std::string cpp_symbol(
+ ProtobufFrameworkImportSymbol(ProtobufLibraryFrameworkName));
if (default_cpp_symbol) {
- p->Emit(
- R"objc(
- // This CPP symbol can be defined to use imports that match up to the framework
- // imports needed when using CocoaPods.
- #if !defined($cpp_symbol$)
- #define $cpp_symbol$ 0
- #endif
-
- )objc");
+ p->Print(
+ // clang-format off
+ "// This CPP symbol can be defined to use imports that match up to the framework\n"
+ "// imports needed when using CocoaPods.\n"
+ "#if !defined($cpp_symbol$)\n"
+ " #define $cpp_symbol$ 0\n"
+ "#endif\n"
+ "\n",
+ // clang-format on
+ "cpp_symbol", cpp_symbol);
}
- p->Emit(
- {
- {"framework_name", ProtobufLibraryFrameworkName},
- {"framework_imports",
- [&] {
- for (const auto& header : protobuf_imports_) {
- p->Emit({{"header", header}},
- R"objc(
- #import <$framework_name$/$header$>
- )objc");
- }
- }},
- {"raw_imports",
- [&] {
- for (const auto& header : protobuf_imports_) {
- p->Emit({{"header", header}},
- R"objc(
- #import "$header$"
- )objc");
- }
- }},
- },
- R"objc(
- #if $cpp_symbol$
- $framework_imports$
- #else
- $raw_imports$
- #endif
- )objc");
+ p->Print("#if $cpp_symbol$\n", "cpp_symbol", cpp_symbol);
+ for (const auto& header : protobuf_imports_) {
+ p->Print(" #import <$framework_name$/$header$>\n", "framework_name",
+ ProtobufLibraryFrameworkName, "header", header);
+ }
+ p->Print("#else\n");
+ for (const auto& header : protobuf_imports_) {
+ p->Print(" #import \"$header$\"\n", "header", header);
+ }
+ p->Print("#endif\n");
}
void ImportWriter::ParseFrameworkMappings() {
diff --git a/src/google/protobuf/compiler/objectivec/import_writer.h b/src/google/protobuf/compiler/objectivec/import_writer.h
index fe75b5f..9f5e0a0 100644
--- a/src/google/protobuf/compiler/objectivec/import_writer.h
+++ b/src/google/protobuf/compiler/objectivec/import_writer.h
@@ -56,8 +56,8 @@
void AddFile(const FileDescriptor* file, const std::string& header_extension);
void AddRuntimeImport(const std::string& header_name);
- void EmitFileImports(io::Printer* p) const;
- void EmitRuntimeImports(io::Printer* p, bool default_cpp_symbol) const;
+ void PrintFileImports(io::Printer* p) const;
+ void PrintRuntimeImports(io::Printer* p, bool default_cpp_symbol) const;
private:
void ParseFrameworkMappings();