diff options
author | Thomas Van Lenten <thomasvl@google.com> | 2016-06-14 13:23:37 -0400 |
---|---|---|
committer | Thomas Van Lenten <thomasvl@google.com> | 2016-06-15 11:36:52 -0400 |
commit | a2a3399a6f84e29ab2dfc8c55739bbd495c314ce (patch) | |
tree | 9a72979f27d09aa268485a208bc9802b45157d56 /src/google/protobuf/compiler/objectivec/objectivec_file.cc | |
parent | 71f4a9c6f35007609ef423ab643c05c1f88731ce (diff) |
Add support for generation sources into a framework.
- Add a protoc objc option (generate_for_named_framework) to set the name of
the framework all generated sources will be in.
- Tweak some comments/naming to make it clear what is the Protobuf framework
vs. the framework for generated code.
- Update the objc README to document the new generation option to protoc.
This is working towards https://github.com/google/protobuf/issues/1457.
Diffstat (limited to 'src/google/protobuf/compiler/objectivec/objectivec_file.cc')
-rw-r--r-- | src/google/protobuf/compiler/objectivec/objectivec_file.cc | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_file.cc b/src/google/protobuf/compiler/objectivec/objectivec_file.cc index 7774058e..73e6d8d7 100644 --- a/src/google/protobuf/compiler/objectivec/objectivec_file.cc +++ b/src/google/protobuf/compiler/objectivec/objectivec_file.cc @@ -54,14 +54,16 @@ namespace { class ImportWriter { public: - ImportWriter() {} + ImportWriter(const Options& options) : options_(options) {} void AddFile(const FileGenerator* file); void Print(io::Printer *printer) const; private: + const Options options_; vector<string> protobuf_framework_imports_; vector<string> protobuf_non_framework_imports_; + vector<string> other_framework_imports_; vector<string> other_imports_; }; @@ -72,6 +74,10 @@ void ImportWriter::AddFile(const FileGenerator* file) { protobuf_framework_imports_.push_back( FilePathBasename(file_descriptor) + extension); protobuf_non_framework_imports_.push_back(file->Path() + extension); + } else if (!options_.generate_for_named_framework.empty()) { + other_framework_imports_.push_back( + options_.generate_for_named_framework + "/" + + FilePathBasename(file_descriptor) + extension); } else { other_imports_.push_back(file->Path() + extension); } @@ -81,6 +87,8 @@ void ImportWriter::Print(io::Printer *printer) const { assert(protobuf_non_framework_imports_.size() == protobuf_framework_imports_.size()); + bool add_blank_line = false; + if (protobuf_framework_imports_.size() > 0) { const string framework_name(ProtobufLibraryFrameworkName); const string cpp_symbol(ProtobufFrameworkImportSymbol(framework_name)); @@ -106,12 +114,29 @@ void ImportWriter::Print(io::Printer *printer) const { printer->Print( "#endif\n"); - if (other_imports_.size() > 0) { + add_blank_line = true; + } + + if (other_framework_imports_.size() > 0) { + if (add_blank_line) { printer->Print("\n"); } + + for (vector<string>::const_iterator iter = other_framework_imports_.begin(); + iter != other_framework_imports_.end(); ++iter) { + printer->Print( + " #import <$header$>\n", + "header", *iter); + } + + add_blank_line = true; } if (other_imports_.size() > 0) { + if (add_blank_line) { + printer->Print("\n"); + } + for (vector<string>::const_iterator iter = other_imports_.begin(); iter != other_imports_.end(); ++iter) { printer->Print( @@ -156,7 +181,7 @@ FileGenerator::~FileGenerator() { } void FileGenerator::GenerateHeader(io::Printer *printer) { - PrintFilePreamble(printer, "GPBProtocolBuffers.h"); + PrintFileRuntimePreamble(printer, "GPBProtocolBuffers.h"); // Add some verification that the generated code matches the source the // code is being compiled with. @@ -170,7 +195,7 @@ void FileGenerator::GenerateHeader(io::Printer *printer) { // #import any headers for "public imports" in the proto file. { - ImportWriter import_writer; + ImportWriter import_writer(options_); const vector<FileGenerator *> &dependency_generators = DependencyGenerators(); for (vector<FileGenerator *>::const_iterator iter = dependency_generators.begin(); @@ -273,10 +298,10 @@ void FileGenerator::GenerateHeader(io::Printer *printer) { void FileGenerator::GenerateSource(io::Printer *printer) { // #import the runtime support. - PrintFilePreamble(printer, "GPBProtocolBuffers_RuntimeSupport.h"); + PrintFileRuntimePreamble(printer, "GPBProtocolBuffers_RuntimeSupport.h"); { - ImportWriter import_writer; + ImportWriter import_writer(options_); // #import the header for this proto file. import_writer.AddFile(this); @@ -471,7 +496,10 @@ const vector<FileGenerator *> &FileGenerator::DependencyGenerators() { return dependency_generators_; } -void FileGenerator::PrintFilePreamble( +// Helper to print the import of the runtime support at the top of generated +// files. This currently only supports the runtime coming from a framework +// as defined by the official CocoaPod. +void FileGenerator::PrintFileRuntimePreamble( io::Printer* printer, const string& header_to_import) const { printer->Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" |