| Index: third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_generator.cc b/third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
|
| index 72e295de4977a0cab826708a591d6f8e2285dfaa..3640746798fadb8b5c43aac2a322a7b767701a16 100644
|
| --- a/third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
|
| @@ -45,12 +45,29 @@ ObjectiveCGenerator::ObjectiveCGenerator() {}
|
|
|
| ObjectiveCGenerator::~ObjectiveCGenerator() {}
|
|
|
| +bool ObjectiveCGenerator::HasGenerateAll() const {
|
| + return true;
|
| +}
|
| +
|
| bool ObjectiveCGenerator::Generate(const FileDescriptor* file,
|
| const string& parameter,
|
| - OutputDirectory* output_directory,
|
| + GeneratorContext* context,
|
| string* error) const {
|
| + *error = "Unimplemented Generate() method. Call GenerateAll() instead.";
|
| + return false;
|
| +}
|
| +
|
| +bool ObjectiveCGenerator::GenerateAll(const vector<const FileDescriptor*>& files,
|
| + const string& parameter,
|
| + GeneratorContext* context,
|
| + string* error) const {
|
| // -----------------------------------------------------------------
|
| - // Parse generator options.
|
| + // Parse generator options. These options are passed to the compiler using the
|
| + // --objc_opt flag. The options are passed as a comma separated list of
|
| + // options along with their values. If the option appears multiple times, only
|
| + // the last value will be considered.
|
| + //
|
| + // e.g. protoc ... --objc_opt=expected_prefixes=file.txt,generate_for_named_framework=MyFramework
|
|
|
| Options generation_options;
|
|
|
| @@ -58,7 +75,52 @@ bool ObjectiveCGenerator::Generate(const FileDescriptor* file,
|
| ParseGeneratorParameter(parameter, &options);
|
| for (int i = 0; i < options.size(); i++) {
|
| if (options[i].first == "expected_prefixes_path") {
|
| + // Path to find a file containing the expected prefixes
|
| + // (objc_class_prefix "PREFIX") for proto packages (package NAME). The
|
| + // generator will then issue warnings/errors if in the proto files being
|
| + // generated the option is not listed/wrong/etc in the file.
|
| + //
|
| + // The format of the file is:
|
| + // - An entry is a line of "package=prefix".
|
| + // - Comments start with "#".
|
| + // - A comment can go on a line after a expected package/prefix pair.
|
| + // (i.e. - "package=prefix # comment")
|
| + //
|
| + // There is no validation that the prefixes are good prefixes, it is
|
| + // assumed that they are when you create the file.
|
| generation_options.expected_prefixes_path = options[i].second;
|
| + } else if (options[i].first == "generate_for_named_framework") {
|
| + // The name of the framework that protos are being generated for. This
|
| + // will cause the #import statements to be framework based using this
|
| + // name (i.e. - "#import <NAME/proto.pbobjc.h>).
|
| + //
|
| + // NOTE: If this option is used with
|
| + // named_framework_to_proto_path_mappings_path, then this is effectively
|
| + // the "default" framework name used for everything that wasn't mapped by
|
| + // the mapping file.
|
| + generation_options.generate_for_named_framework = options[i].second;
|
| + } else if (options[i].first == "named_framework_to_proto_path_mappings_path") {
|
| + // Path to find a file containing the list of framework names and proto
|
| + // files. The generator uses this to decide if a proto file
|
| + // referenced should use a framework style import vs. a user level import
|
| + // (#import <FRAMEWORK/file.pbobjc.h> vs #import "dir/file.pbobjc.h").
|
| + //
|
| + // The format of the file is:
|
| + // - An entry is a line of "frameworkName: file.proto, dir/file2.proto".
|
| + // - Comments start with "#".
|
| + // - A comment can go on a line after a expected package/prefix pair.
|
| + // (i.e. - "frameworkName: file.proto # comment")
|
| + //
|
| + // Any number of files can be listed for a framework, just separate them
|
| + // with commas.
|
| + //
|
| + // There can be multiple lines listing the same frameworkName incase it
|
| + // has a lot of proto files included in it; having multiple lines makes
|
| + // things easier to read. If a proto file is not configured in the
|
| + // mappings file, it will use the default framework name if one was passed
|
| + // with generate_for_named_framework, or the relative path to it's include
|
| + // path otherwise.
|
| + generation_options.named_framework_to_proto_path_mappings_path = options[i].second;
|
| } else {
|
| *error = "error: Unknown generator option: " + options[i].first;
|
| return false;
|
| @@ -67,29 +129,32 @@ bool ObjectiveCGenerator::Generate(const FileDescriptor* file,
|
|
|
| // -----------------------------------------------------------------
|
|
|
| - // Validate the objc prefix/package pairing.
|
| - if (!ValidateObjCClassPrefix(file, generation_options, error)) {
|
| + // Validate the objc prefix/package pairings.
|
| + if (!ValidateObjCClassPrefixes(files, generation_options, error)) {
|
| // *error will have been filled in.
|
| return false;
|
| }
|
|
|
| - FileGenerator file_generator(file, generation_options);
|
| - string filepath = FilePath(file);
|
| + for (int i = 0; i < files.size(); i++) {
|
| + const FileDescriptor* file = files[i];
|
| + FileGenerator file_generator(file, generation_options);
|
| + string filepath = FilePath(file);
|
|
|
| - // Generate header.
|
| - {
|
| - scoped_ptr<io::ZeroCopyOutputStream> output(
|
| - output_directory->Open(filepath + ".pbobjc.h"));
|
| - io::Printer printer(output.get(), '$');
|
| - file_generator.GenerateHeader(&printer);
|
| - }
|
| + // Generate header.
|
| + {
|
| + scoped_ptr<io::ZeroCopyOutputStream> output(
|
| + context->Open(filepath + ".pbobjc.h"));
|
| + io::Printer printer(output.get(), '$');
|
| + file_generator.GenerateHeader(&printer);
|
| + }
|
|
|
| - // Generate m file.
|
| - {
|
| - scoped_ptr<io::ZeroCopyOutputStream> output(
|
| - output_directory->Open(filepath + ".pbobjc.m"));
|
| - io::Printer printer(output.get(), '$');
|
| - file_generator.GenerateSource(&printer);
|
| + // Generate m file.
|
| + {
|
| + scoped_ptr<io::ZeroCopyOutputStream> output(
|
| + context->Open(filepath + ".pbobjc.m"));
|
| + io::Printer printer(output.get(), '$');
|
| + file_generator.GenerateSource(&printer);
|
| + }
|
| }
|
|
|
| return true;
|
|
|