| Index: third_party/protobuf/src/google/protobuf/compiler/mock_code_generator.cc
|
| diff --git a/third_party/protobuf/src/google/protobuf/compiler/mock_code_generator.cc b/third_party/protobuf/src/google/protobuf/compiler/mock_code_generator.cc
|
| index 83d5a4e457a16a91e5af7692c23e26f195152e36..5b76af257792472748d0ac397580d7c1d05f5343 100644
|
| --- a/third_party/protobuf/src/google/protobuf/compiler/mock_code_generator.cc
|
| +++ b/third_party/protobuf/src/google/protobuf/compiler/mock_code_generator.cc
|
| @@ -45,6 +45,16 @@ namespace google {
|
| namespace protobuf {
|
| namespace compiler {
|
|
|
| +// Returns the list of the names of files in all_files in the form of a
|
| +// comma-separated string.
|
| +string CommaSeparatedList(const vector<const FileDescriptor*> all_files) {
|
| + vector<string> names;
|
| + for (int i = 0; i < all_files.size(); i++) {
|
| + names.push_back(all_files[i]->name());
|
| + }
|
| + return JoinStrings(names, ",");
|
| +}
|
| +
|
| static const char* kFirstInsertionPointName = "first_mock_insertion_point";
|
| static const char* kSecondInsertionPointName = "second_mock_insertion_point";
|
| static const char* kFirstInsertionPoint =
|
| @@ -63,6 +73,7 @@ void MockCodeGenerator::ExpectGenerated(
|
| const string& insertions,
|
| const string& file,
|
| const string& first_message_name,
|
| + const string& first_parsed_file_name,
|
| const string& output_directory) {
|
| string content;
|
| ASSERT_TRUE(File::ReadFileToString(
|
| @@ -84,7 +95,8 @@ void MockCodeGenerator::ExpectGenerated(
|
| }
|
|
|
| ASSERT_EQ(lines.size(), 3 + insertion_list.size() * 2);
|
| - EXPECT_EQ(GetOutputFileContent(name, parameter, file, first_message_name),
|
| + EXPECT_EQ(GetOutputFileContent(name, parameter, file,
|
| + first_parsed_file_name, first_message_name),
|
| lines[0]);
|
|
|
| EXPECT_EQ(kFirstInsertionPoint, lines[1 + insertion_list.size()]);
|
| @@ -92,12 +104,12 @@ void MockCodeGenerator::ExpectGenerated(
|
|
|
| for (int i = 0; i < insertion_list.size(); i++) {
|
| EXPECT_EQ(GetOutputFileContent(insertion_list[i], "first_insert",
|
| - file, first_message_name),
|
| + file, file, first_message_name),
|
| lines[1 + i]);
|
| // Second insertion point is indented, so the inserted text should
|
| // automatically be indented too.
|
| EXPECT_EQ(" " + GetOutputFileContent(insertion_list[i], "second_insert",
|
| - file, first_message_name),
|
| + file, file, first_message_name),
|
| lines[2 + insertion_list.size() + i]);
|
| }
|
| }
|
| @@ -105,7 +117,7 @@ void MockCodeGenerator::ExpectGenerated(
|
| bool MockCodeGenerator::Generate(
|
| const FileDescriptor* file,
|
| const string& parameter,
|
| - OutputDirectory* output_directory,
|
| + GeneratorContext* context,
|
| string* error) const {
|
| for (int i = 0; i < file->message_type_count(); i++) {
|
| if (HasPrefixString(file->message_type(i)->name(), "MockCodeGenerator_")) {
|
| @@ -134,11 +146,12 @@ bool MockCodeGenerator::Generate(
|
| for (int i = 0; i < insert_into.size(); i++) {
|
| {
|
| scoped_ptr<io::ZeroCopyOutputStream> output(
|
| - output_directory->OpenForInsert(
|
| + context->OpenForInsert(
|
| GetOutputFileName(insert_into[i], file),
|
| kFirstInsertionPointName));
|
| io::Printer printer(output.get(), '$');
|
| - printer.PrintRaw(GetOutputFileContent(name_, "first_insert", file));
|
| + printer.PrintRaw(GetOutputFileContent(name_, "first_insert",
|
| + file, context));
|
| if (printer.failed()) {
|
| *error = "MockCodeGenerator detected write error.";
|
| return false;
|
| @@ -147,11 +160,12 @@ bool MockCodeGenerator::Generate(
|
|
|
| {
|
| scoped_ptr<io::ZeroCopyOutputStream> output(
|
| - output_directory->OpenForInsert(
|
| + context->OpenForInsert(
|
| GetOutputFileName(insert_into[i], file),
|
| kSecondInsertionPointName));
|
| io::Printer printer(output.get(), '$');
|
| - printer.PrintRaw(GetOutputFileContent(name_, "second_insert", file));
|
| + printer.PrintRaw(GetOutputFileContent(name_, "second_insert",
|
| + file, context));
|
| if (printer.failed()) {
|
| *error = "MockCodeGenerator detected write error.";
|
| return false;
|
| @@ -160,10 +174,11 @@ bool MockCodeGenerator::Generate(
|
| }
|
| } else {
|
| scoped_ptr<io::ZeroCopyOutputStream> output(
|
| - output_directory->Open(GetOutputFileName(name_, file)));
|
| + context->Open(GetOutputFileName(name_, file)));
|
|
|
| io::Printer printer(output.get(), '$');
|
| - printer.PrintRaw(GetOutputFileContent(name_, parameter, file));
|
| + printer.PrintRaw(GetOutputFileContent(name_, parameter,
|
| + file, context));
|
| printer.PrintRaw(kFirstInsertionPoint);
|
| printer.PrintRaw(kSecondInsertionPoint);
|
|
|
| @@ -186,11 +201,16 @@ string MockCodeGenerator::GetOutputFileName(const string& generator_name,
|
| return file + ".MockCodeGenerator." + generator_name;
|
| }
|
|
|
| -string MockCodeGenerator::GetOutputFileContent(const string& generator_name,
|
| - const string& parameter,
|
| - const FileDescriptor* file) {
|
| +string MockCodeGenerator::GetOutputFileContent(
|
| + const string& generator_name,
|
| + const string& parameter,
|
| + const FileDescriptor* file,
|
| + GeneratorContext *context) {
|
| + vector<const FileDescriptor*> all_files;
|
| + context->ListParsedFiles(&all_files);
|
| return GetOutputFileContent(
|
| generator_name, parameter, file->name(),
|
| + CommaSeparatedList(all_files),
|
| file->message_type_count() > 0 ?
|
| file->message_type(0)->name() : "(none)");
|
| }
|
| @@ -199,9 +219,11 @@ string MockCodeGenerator::GetOutputFileContent(
|
| const string& generator_name,
|
| const string& parameter,
|
| const string& file,
|
| + const string& parsed_file_list,
|
| const string& first_message_name) {
|
| - return strings::Substitute("$0: $1, $2, $3\n",
|
| - generator_name, parameter, file, first_message_name);
|
| + return strings::Substitute("$0: $1, $2, $3, $4\n",
|
| + generator_name, parameter, file,
|
| + first_message_name, parsed_file_list);
|
| }
|
|
|
| } // namespace compiler
|
|
|