diff options
author | Thomas Van Lenten <thomasvl@google.com> | 2018-03-28 16:53:39 -0400 |
---|---|---|
committer | Thomas Van Lenten <thomasvl@google.com> | 2018-04-02 09:54:29 -0400 |
commit | bca797dac9c5c6f549be12e2bc9addbf51b1d18f (patch) | |
tree | 7c7847cd60c0ca9a1f65829737538794960fb323 /src/google | |
parent | 7bf47a6b5d10382a4b427677cf7ca9288f4e2833 (diff) | |
download | protobuf-bca797dac9c5c6f549be12e2bc9addbf51b1d18f.tar.gz protobuf-bca797dac9c5c6f549be12e2bc9addbf51b1d18f.tar.bz2 protobuf-bca797dac9c5c6f549be12e2bc9addbf51b1d18f.zip |
Trim imports for bundled generated protos.
To avoid a cycle between headers, have the WKTs use minimal imports instead
of using the helper to get everything from the library.
Fixes https://github.com/google/protobuf/issues/4301
Fixes https://github.com/google/protobuf/issues/4403
Diffstat (limited to 'src/google')
-rw-r--r-- | src/google/protobuf/compiler/objectivec/objectivec_file.cc | 51 | ||||
-rw-r--r-- | src/google/protobuf/compiler/objectivec/objectivec_file.h | 2 |
2 files changed, 41 insertions, 12 deletions
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_file.cc b/src/google/protobuf/compiler/objectivec/objectivec_file.cc index 6f80a0de..2b14bbe8 100644 --- a/src/google/protobuf/compiler/objectivec/objectivec_file.cc +++ b/src/google/protobuf/compiler/objectivec/objectivec_file.cc @@ -214,7 +214,17 @@ FileGenerator::~FileGenerator() { } void FileGenerator::GenerateHeader(io::Printer *printer) { - PrintFileRuntimePreamble(printer, "GPBProtocolBuffers.h"); + std::set<string> headers; + // Generated files bundled with the library get minimal imports, everything + // else gets the wrapper so everything is usable. + if (IsProtobufLibraryBundledProtoFile(file_)) { + headers.insert("GPBRootObject.h"); + headers.insert("GPBMessage.h"); + headers.insert("GPBDescriptor.h"); + } else { + headers.insert("GPBProtocolBuffers.h"); + } + PrintFileRuntimePreamble(printer, headers); // Add some verification that the generated code matches the source the // code is being compiled with. @@ -337,7 +347,9 @@ void FileGenerator::GenerateHeader(io::Printer *printer) { void FileGenerator::GenerateSource(io::Printer *printer) { // #import the runtime support. - PrintFileRuntimePreamble(printer, "GPBProtocolBuffers_RuntimeSupport.h"); + std::set<string> headers; + headers.insert("GPBProtocolBuffers_RuntimeSupport.h"); + PrintFileRuntimePreamble(printer, headers); // Enums use atomic in the generated code, so add the system import as needed. if (FileContainsEnums(file_)) { @@ -566,7 +578,7 @@ void FileGenerator::GenerateSource(io::Printer *printer) { // 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 { + io::Printer* printer, const std::set<string>& headers_to_import) const { printer->Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" "// source: $filename$\n" @@ -575,6 +587,7 @@ void FileGenerator::PrintFileRuntimePreamble( const string framework_name(ProtobufLibraryFrameworkName); const string cpp_symbol(ProtobufFrameworkImportSymbol(framework_name)); + printer->Print( "// This CPP symbol can be defined to use imports that match up to the framework\n" "// imports needed when using CocoaPods.\n" @@ -582,15 +595,31 @@ void FileGenerator::PrintFileRuntimePreamble( " #define $cpp_symbol$ 0\n" "#endif\n" "\n" - "#if $cpp_symbol$\n" - " #import <$framework_name$/$header$>\n" - "#else\n" - " #import \"$header$\"\n" + "#if $cpp_symbol$\n", + "cpp_symbol", cpp_symbol); + + + for (std::set<string>::const_iterator iter = headers_to_import.begin(); + iter != headers_to_import.end(); ++iter) { + printer->Print( + " #import <$framework_name$/$header$>\n", + "header", *iter, + "framework_name", framework_name); + } + + printer->Print( + "#else\n"); + + for (std::set<string>::const_iterator iter = headers_to_import.begin(); + iter != headers_to_import.end(); ++iter) { + printer->Print( + " #import \"$header$\"\n", + "header", *iter); + } + + printer->Print( "#endif\n" - "\n", - "cpp_symbol", cpp_symbol, - "header", header_to_import, - "framework_name", framework_name); + "\n"); } } // namespace objectivec diff --git a/src/google/protobuf/compiler/objectivec/objectivec_file.h b/src/google/protobuf/compiler/objectivec/objectivec_file.h index 9c3f0071..862f5bb9 100644 --- a/src/google/protobuf/compiler/objectivec/objectivec_file.h +++ b/src/google/protobuf/compiler/objectivec/objectivec_file.h @@ -74,7 +74,7 @@ class FileGenerator { const Options options_; void PrintFileRuntimePreamble( - io::Printer* printer, const string& header_to_import) const; + io::Printer* printer, const std::set<string>& headers_to_import) const; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator); }; |