|
@@ -50,6 +50,80 @@ const int32 GOOGLE_PROTOBUF_OBJC_GEN_VERSION = 30001;
|
|
namespace compiler {
|
|
namespace compiler {
|
|
namespace objectivec {
|
|
namespace objectivec {
|
|
|
|
|
|
|
|
+namespace {
|
|
|
|
+
|
|
|
|
+class ImportWriter {
|
|
|
|
+ public:
|
|
|
|
+ ImportWriter() {}
|
|
|
|
+
|
|
|
|
+ void AddFile(const FileGenerator* file);
|
|
|
|
+ void Print(io::Printer *printer) const;
|
|
|
|
+
|
|
|
|
+ private:
|
|
|
|
+ vector<string> protobuf_framework_imports_;
|
|
|
|
+ vector<string> protobuf_non_framework_imports_;
|
|
|
|
+ vector<string> other_imports_;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+void ImportWriter::AddFile(const FileGenerator* file) {
|
|
|
|
+ const FileDescriptor* file_descriptor = file->Descriptor();
|
|
|
|
+ const string extension(".pbobjc.h");
|
|
|
|
+ if (IsProtobufLibraryBundledProtoFile(file_descriptor)) {
|
|
|
|
+ protobuf_framework_imports_.push_back(
|
|
|
|
+ FilePathBasename(file_descriptor) + extension);
|
|
|
|
+ protobuf_non_framework_imports_.push_back(file->Path() + extension);
|
|
|
|
+ } else {
|
|
|
|
+ other_imports_.push_back(file->Path() + extension);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImportWriter::Print(io::Printer *printer) const {
|
|
|
|
+ assert(protobuf_non_framework_imports_.size() ==
|
|
|
|
+ protobuf_framework_imports_.size());
|
|
|
|
+
|
|
|
|
+ if (protobuf_framework_imports_.size() > 0) {
|
|
|
|
+ const string framework_name(ProtobufLibraryFrameworkName);
|
|
|
|
+ const string cpp_symbol(ProtobufFrameworkImportSymbol(framework_name));
|
|
|
|
+
|
|
|
|
+ printer->Print(
|
|
|
|
+ "#if $cpp_symbol$\n",
|
|
|
|
+ "cpp_symbol", cpp_symbol);
|
|
|
|
+ for (vector<string>::const_iterator iter = protobuf_framework_imports_.begin();
|
|
|
|
+ iter != protobuf_framework_imports_.end(); ++iter) {
|
|
|
|
+ printer->Print(
|
|
|
|
+ " #import <$framework_name$/$header$>\n",
|
|
|
|
+ "framework_name", framework_name,
|
|
|
|
+ "header", *iter);
|
|
|
|
+ }
|
|
|
|
+ printer->Print(
|
|
|
|
+ "#else\n");
|
|
|
|
+ for (vector<string>::const_iterator iter = protobuf_non_framework_imports_.begin();
|
|
|
|
+ iter != protobuf_non_framework_imports_.end(); ++iter) {
|
|
|
|
+ printer->Print(
|
|
|
|
+ " #import \"$header$\"\n",
|
|
|
|
+ "header", *iter);
|
|
|
|
+ }
|
|
|
|
+ printer->Print(
|
|
|
|
+ "#endif\n");
|
|
|
|
+
|
|
|
|
+ if (other_imports_.size() > 0) {
|
|
|
|
+ printer->Print("\n");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (other_imports_.size() > 0) {
|
|
|
|
+ for (vector<string>::const_iterator iter = other_imports_.begin();
|
|
|
|
+ iter != other_imports_.end(); ++iter) {
|
|
|
|
+ printer->Print(
|
|
|
|
+ " #import \"$header$\"\n",
|
|
|
|
+ "header", *iter);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+} // namespace
|
|
|
|
+
|
|
|
|
+
|
|
FileGenerator::FileGenerator(const FileDescriptor *file, const Options& options)
|
|
FileGenerator::FileGenerator(const FileDescriptor *file, const Options& options)
|
|
: file_(file),
|
|
: file_(file),
|
|
root_class_name_(FileClassName(file)),
|
|
root_class_name_(FileClassName(file)),
|
|
@@ -82,15 +156,7 @@ FileGenerator::~FileGenerator() {
|
|
}
|
|
}
|
|
|
|
|
|
void FileGenerator::GenerateHeader(io::Printer *printer) {
|
|
void FileGenerator::GenerateHeader(io::Printer *printer) {
|
|
- printer->Print(
|
|
|
|
- "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
|
|
|
|
- "// source: $filename$\n"
|
|
|
|
- "\n",
|
|
|
|
- "filename", file_->name());
|
|
|
|
-
|
|
|
|
- printer->Print(
|
|
|
|
- "#import \"GPBProtocolBuffers.h\"\n"
|
|
|
|
- "\n");
|
|
|
|
|
|
+ PrintFilePreamble(printer, "GPBProtocolBuffers.h");
|
|
|
|
|
|
// Add some verification that the generated code matches the source the
|
|
// Add some verification that the generated code matches the source the
|
|
// code is being compiled with.
|
|
// code is being compiled with.
|
|
@@ -102,14 +168,18 @@ void FileGenerator::GenerateHeader(io::Printer *printer) {
|
|
"protoc_gen_objc_version",
|
|
"protoc_gen_objc_version",
|
|
SimpleItoa(GOOGLE_PROTOBUF_OBJC_GEN_VERSION));
|
|
SimpleItoa(GOOGLE_PROTOBUF_OBJC_GEN_VERSION));
|
|
|
|
|
|
- const vector<FileGenerator *> &dependency_generators = DependencyGenerators();
|
|
|
|
- for (vector<FileGenerator *>::const_iterator iter =
|
|
|
|
- dependency_generators.begin();
|
|
|
|
- iter != dependency_generators.end(); ++iter) {
|
|
|
|
- if ((*iter)->IsPublicDependency()) {
|
|
|
|
- printer->Print("#import \"$header$.pbobjc.h\"\n",
|
|
|
|
- "header", (*iter)->Path());
|
|
|
|
|
|
+ // #import any headers for "public imports" in the proto file.
|
|
|
|
+ {
|
|
|
|
+ ImportWriter import_writer;
|
|
|
|
+ const vector<FileGenerator *> &dependency_generators = DependencyGenerators();
|
|
|
|
+ for (vector<FileGenerator *>::const_iterator iter =
|
|
|
|
+ dependency_generators.begin();
|
|
|
|
+ iter != dependency_generators.end(); ++iter) {
|
|
|
|
+ if ((*iter)->IsPublicDependency()) {
|
|
|
|
+ import_writer.AddFile(*iter);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ import_writer.Print(printer);
|
|
}
|
|
}
|
|
|
|
|
|
printer->Print(
|
|
printer->Print(
|
|
@@ -198,27 +268,30 @@ void FileGenerator::GenerateHeader(io::Printer *printer) {
|
|
}
|
|
}
|
|
|
|
|
|
void FileGenerator::GenerateSource(io::Printer *printer) {
|
|
void FileGenerator::GenerateSource(io::Printer *printer) {
|
|
- printer->Print(
|
|
|
|
- "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
|
|
|
|
- "// source: $filename$\n"
|
|
|
|
- "\n",
|
|
|
|
- "filename", file_->name());
|
|
|
|
|
|
+ // #import the runtime support.
|
|
|
|
+ PrintFilePreamble(printer, "GPBProtocolBuffers_RuntimeSupport.h");
|
|
|
|
|
|
- string header_file = Path() + ".pbobjc.h";
|
|
|
|
- printer->Print(
|
|
|
|
- "#import \"GPBProtocolBuffers_RuntimeSupport.h\"\n"
|
|
|
|
- "#import \"$header_file$\"\n",
|
|
|
|
- "header_file", header_file);
|
|
|
|
- const vector<FileGenerator *> &dependency_generators =
|
|
|
|
- DependencyGenerators();
|
|
|
|
- for (vector<FileGenerator *>::const_iterator iter =
|
|
|
|
- dependency_generators.begin();
|
|
|
|
- iter != dependency_generators.end(); ++iter) {
|
|
|
|
- if (!(*iter)->IsPublicDependency()) {
|
|
|
|
- printer->Print("#import \"$header$.pbobjc.h\"\n",
|
|
|
|
- "header", (*iter)->Path());
|
|
|
|
|
|
+ {
|
|
|
|
+ ImportWriter import_writer;
|
|
|
|
+
|
|
|
|
+ // #import the header for this proto file.
|
|
|
|
+ import_writer.AddFile(this);
|
|
|
|
+
|
|
|
|
+ // #import the headers for anything that a plain dependency of this proto
|
|
|
|
+ // file (that means they were just an include, not a "public" include).
|
|
|
|
+ const vector<FileGenerator *> &dependency_generators =
|
|
|
|
+ DependencyGenerators();
|
|
|
|
+ for (vector<FileGenerator *>::const_iterator iter =
|
|
|
|
+ dependency_generators.begin();
|
|
|
|
+ iter != dependency_generators.end(); ++iter) {
|
|
|
|
+ if (!(*iter)->IsPublicDependency()) {
|
|
|
|
+ import_writer.AddFile(*iter);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ import_writer.Print(printer);
|
|
}
|
|
}
|
|
|
|
+
|
|
printer->Print(
|
|
printer->Print(
|
|
"// @@protoc_insertion_point(imports)\n"
|
|
"// @@protoc_insertion_point(imports)\n"
|
|
"\n"
|
|
"\n"
|
|
@@ -356,8 +429,6 @@ void FileGenerator::GenerateSource(io::Printer *printer) {
|
|
"// @@protoc_insertion_point(global_scope)\n");
|
|
"// @@protoc_insertion_point(global_scope)\n");
|
|
}
|
|
}
|
|
|
|
|
|
-const string FileGenerator::Path() const { return FilePath(file_); }
|
|
|
|
-
|
|
|
|
const vector<FileGenerator *> &FileGenerator::DependencyGenerators() {
|
|
const vector<FileGenerator *> &FileGenerator::DependencyGenerators() {
|
|
if (file_->dependency_count() != dependency_generators_.size()) {
|
|
if (file_->dependency_count() != dependency_generators_.size()) {
|
|
set<string> public_import_names;
|
|
set<string> public_import_names;
|
|
@@ -376,6 +447,34 @@ const vector<FileGenerator *> &FileGenerator::DependencyGenerators() {
|
|
return dependency_generators_;
|
|
return dependency_generators_;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void FileGenerator::PrintFilePreamble(
|
|
|
|
+ io::Printer* printer, const string& header_to_import) const {
|
|
|
|
+ printer->Print(
|
|
|
|
+ "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
|
|
|
|
+ "// source: $filename$\n"
|
|
|
|
+ "\n",
|
|
|
|
+ "filename", file_->name());
|
|
|
|
+
|
|
|
|
+ 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"
|
|
|
|
+ "#if !defined($cpp_symbol$)\n"
|
|
|
|
+ " #define $cpp_symbol$ 0\n"
|
|
|
|
+ "#endif\n"
|
|
|
|
+ "\n"
|
|
|
|
+ "#if $cpp_symbol$\n"
|
|
|
|
+ " #import <$framework_name$/$header$>\n"
|
|
|
|
+ "#else\n"
|
|
|
|
+ " #import \"$header$\"\n"
|
|
|
|
+ "#endif\n"
|
|
|
|
+ "\n",
|
|
|
|
+ "cpp_symbol", cpp_symbol,
|
|
|
|
+ "header", header_to_import,
|
|
|
|
+ "framework_name", framework_name);
|
|
|
|
+}
|
|
|
|
+
|
|
} // namespace objectivec
|
|
} // namespace objectivec
|
|
} // namespace compiler
|
|
} // namespace compiler
|
|
} // namespace protobuf
|
|
} // namespace protobuf
|