Index: third_party/protobuf/src/google/protobuf/compiler/command_line_interface.cc |
diff --git a/third_party/protobuf/src/google/protobuf/compiler/command_line_interface.cc b/third_party/protobuf/src/google/protobuf/compiler/command_line_interface.cc |
index 02c3e0f960975392e691e6bdc823e7db294bbdc7..1c76994bdcf8e555602ca99f3d8c75fd67994a3f 100644 |
--- a/third_party/protobuf/src/google/protobuf/compiler/command_line_interface.cc |
+++ b/third_party/protobuf/src/google/protobuf/compiler/command_line_interface.cc |
@@ -48,6 +48,9 @@ |
#include <iostream> |
#include <ctype.h> |
+#include <google/protobuf/stubs/hash.h> |
+ |
+#include <google/protobuf/stubs/common.h> |
#include <google/protobuf/compiler/importer.h> |
#include <google/protobuf/compiler/code_generator.h> |
#include <google/protobuf/compiler/plugin.pb.h> |
@@ -58,12 +61,10 @@ |
#include <google/protobuf/dynamic_message.h> |
#include <google/protobuf/io/zero_copy_stream_impl.h> |
#include <google/protobuf/io/printer.h> |
-#include <google/protobuf/stubs/common.h> |
#include <google/protobuf/stubs/strutil.h> |
#include <google/protobuf/stubs/substitute.h> |
#include <google/protobuf/stubs/map-util.h> |
#include <google/protobuf/stubs/stl_util-inl.h> |
-#include <google/protobuf/stubs/hash.h> |
namespace google { |
@@ -182,7 +183,7 @@ bool TryCreateParentDirectory(const string& prefix, const string& filename) { |
class CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector, |
public io::ErrorCollector { |
public: |
- ErrorPrinter(ErrorFormat format, DiskSourceTree *tree = NULL) |
+ ErrorPrinter(ErrorFormat format, DiskSourceTree *tree = NULL) |
: format_(format), tree_(tree) {} |
~ErrorPrinter() {} |
@@ -191,8 +192,8 @@ class CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector, |
const string& message) { |
// Print full path when running under MSVS |
- std::string dfile; |
- if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS && |
+ string dfile; |
+ if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS && |
tree_ != NULL && |
tree_->VirtualFileToDiskFile(filename, &dfile)) { |
cerr << dfile; |
@@ -229,12 +230,12 @@ class CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector, |
// ------------------------------------------------------------------- |
-// An OutputDirectory implementation that buffers files in memory, then dumps |
+// A GeneratorContext implementation that buffers files in memory, then dumps |
// them all to disk on demand. |
-class CommandLineInterface::MemoryOutputDirectory : public OutputDirectory { |
+class CommandLineInterface::GeneratorContextImpl : public GeneratorContext { |
public: |
- MemoryOutputDirectory(); |
- ~MemoryOutputDirectory(); |
+ GeneratorContextImpl(const vector<const FileDescriptor*>& parsed_files); |
+ ~GeneratorContextImpl(); |
// Write all files in the directory to disk at the given output location, |
// which must end in a '/'. |
@@ -248,10 +249,13 @@ class CommandLineInterface::MemoryOutputDirectory : public OutputDirectory { |
// format, unless one has already been written. |
void AddJarManifest(); |
- // implements OutputDirectory -------------------------------------- |
+ // implements GeneratorContext -------------------------------------- |
io::ZeroCopyOutputStream* Open(const string& filename); |
io::ZeroCopyOutputStream* OpenForInsert( |
const string& filename, const string& insertion_point); |
+ void ListParsedFiles(vector<const FileDescriptor*>* output) { |
+ *output = parsed_files_; |
+ } |
private: |
friend class MemoryOutputStream; |
@@ -259,14 +263,15 @@ class CommandLineInterface::MemoryOutputDirectory : public OutputDirectory { |
// map instead of hash_map so that files are written in order (good when |
// writing zips). |
map<string, string*> files_; |
+ const vector<const FileDescriptor*>& parsed_files_; |
bool had_error_; |
}; |
class CommandLineInterface::MemoryOutputStream |
: public io::ZeroCopyOutputStream { |
public: |
- MemoryOutputStream(MemoryOutputDirectory* directory, const string& filename); |
- MemoryOutputStream(MemoryOutputDirectory* directory, const string& filename, |
+ MemoryOutputStream(GeneratorContextImpl* directory, const string& filename); |
+ MemoryOutputStream(GeneratorContextImpl* directory, const string& filename, |
const string& insertion_point); |
virtual ~MemoryOutputStream(); |
@@ -277,7 +282,7 @@ class CommandLineInterface::MemoryOutputStream |
private: |
// Where to insert the string when it's done. |
- MemoryOutputDirectory* directory_; |
+ GeneratorContextImpl* directory_; |
string filename_; |
string insertion_point_; |
@@ -290,14 +295,17 @@ class CommandLineInterface::MemoryOutputStream |
// ------------------------------------------------------------------- |
-CommandLineInterface::MemoryOutputDirectory::MemoryOutputDirectory() |
- : had_error_(false) {} |
+CommandLineInterface::GeneratorContextImpl::GeneratorContextImpl( |
+ const vector<const FileDescriptor*>& parsed_files) |
+ : parsed_files_(parsed_files), |
+ had_error_(false) { |
+} |
-CommandLineInterface::MemoryOutputDirectory::~MemoryOutputDirectory() { |
+CommandLineInterface::GeneratorContextImpl::~GeneratorContextImpl() { |
STLDeleteValues(&files_); |
} |
-bool CommandLineInterface::MemoryOutputDirectory::WriteAllToDisk( |
+bool CommandLineInterface::GeneratorContextImpl::WriteAllToDisk( |
const string& prefix) { |
if (had_error_) { |
return false; |
@@ -372,7 +380,7 @@ bool CommandLineInterface::MemoryOutputDirectory::WriteAllToDisk( |
return true; |
} |
-bool CommandLineInterface::MemoryOutputDirectory::WriteAllToZip( |
+bool CommandLineInterface::GeneratorContextImpl::WriteAllToZip( |
const string& filename) { |
if (had_error_) { |
return false; |
@@ -413,7 +421,7 @@ bool CommandLineInterface::MemoryOutputDirectory::WriteAllToZip( |
return true; |
} |
-void CommandLineInterface::MemoryOutputDirectory::AddJarManifest() { |
+void CommandLineInterface::GeneratorContextImpl::AddJarManifest() { |
string** map_slot = &files_["META-INF/MANIFEST.MF"]; |
if (*map_slot == NULL) { |
*map_slot = new string( |
@@ -423,13 +431,13 @@ void CommandLineInterface::MemoryOutputDirectory::AddJarManifest() { |
} |
} |
-io::ZeroCopyOutputStream* CommandLineInterface::MemoryOutputDirectory::Open( |
+io::ZeroCopyOutputStream* CommandLineInterface::GeneratorContextImpl::Open( |
const string& filename) { |
return new MemoryOutputStream(this, filename); |
} |
io::ZeroCopyOutputStream* |
-CommandLineInterface::MemoryOutputDirectory::OpenForInsert( |
+CommandLineInterface::GeneratorContextImpl::OpenForInsert( |
const string& filename, const string& insertion_point) { |
return new MemoryOutputStream(this, filename, insertion_point); |
} |
@@ -437,14 +445,14 @@ CommandLineInterface::MemoryOutputDirectory::OpenForInsert( |
// ------------------------------------------------------------------- |
CommandLineInterface::MemoryOutputStream::MemoryOutputStream( |
- MemoryOutputDirectory* directory, const string& filename) |
+ GeneratorContextImpl* directory, const string& filename) |
: directory_(directory), |
filename_(filename), |
inner_(new io::StringOutputStream(&data_)) { |
} |
CommandLineInterface::MemoryOutputStream::MemoryOutputStream( |
- MemoryOutputDirectory* directory, const string& filename, |
+ GeneratorContextImpl* directory, const string& filename, |
const string& insertion_point) |
: directory_(directory), |
filename_(filename), |
@@ -613,11 +621,11 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) { |
} |
} |
- // We construct a separate OutputDirectory for each output location. Note |
+ // We construct a separate GeneratorContext for each output location. Note |
// that two code generators may output to the same location, in which case |
- // they should share a single OutputDirectory (so that OpenForInsert() works). |
- typedef hash_map<string, MemoryOutputDirectory*> OutputDirectoryMap; |
- OutputDirectoryMap output_directories; |
+ // they should share a single GeneratorContext so that OpenForInsert() works. |
+ typedef hash_map<string, GeneratorContextImpl*> GeneratorContextMap; |
+ GeneratorContextMap output_directories; |
// Generate output. |
if (mode_ == MODE_COMPILE) { |
@@ -627,11 +635,11 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) { |
!HasSuffixString(output_location, ".jar")) { |
AddTrailingSlash(&output_location); |
} |
- MemoryOutputDirectory** map_slot = &output_directories[output_location]; |
+ GeneratorContextImpl** map_slot = &output_directories[output_location]; |
if (*map_slot == NULL) { |
// First time we've seen this output location. |
- *map_slot = new MemoryOutputDirectory; |
+ *map_slot = new GeneratorContextImpl(parsed_files); |
} |
if (!GenerateOutput(parsed_files, output_directives_[i], *map_slot)) { |
@@ -642,10 +650,10 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) { |
} |
// Write all output to disk. |
- for (OutputDirectoryMap::iterator iter = output_directories.begin(); |
+ for (GeneratorContextMap::iterator iter = output_directories.begin(); |
iter != output_directories.end(); ++iter) { |
const string& location = iter->first; |
- MemoryOutputDirectory* directory = iter->second; |
+ GeneratorContextImpl* directory = iter->second; |
if (HasSuffixString(location, "/")) { |
if (!directory->WriteAllToDisk(location)) { |
STLDeleteValues(&output_directories); |
@@ -773,7 +781,7 @@ bool CommandLineInterface::ParseArguments(int argc, const char* const argv[]) { |
// If no --proto_path was given, use the current working directory. |
if (proto_path_.empty()) { |
- proto_path_.push_back(make_pair("", ".")); |
+ proto_path_.push_back(make_pair<string, string>("", ".")); |
} |
// Check some errror cases. |
@@ -902,7 +910,7 @@ bool CommandLineInterface::InterpretArgument(const string& name, |
cerr << disk_path << ": warning: directory does not exist." << endl; |
} |
- proto_path_.push_back(make_pair(virtual_path, disk_path)); |
+ proto_path_.push_back(make_pair<string, string>(virtual_path, disk_path)); |
} |
} else if (name == "-o" || name == "--descriptor_set_out") { |
@@ -1107,7 +1115,7 @@ void CommandLineInterface::PrintHelpText() { |
bool CommandLineInterface::GenerateOutput( |
const vector<const FileDescriptor*>& parsed_files, |
const OutputDirective& output_directive, |
- OutputDirectory* output_directory) { |
+ GeneratorContext* generator_context) { |
// Call the generator. |
string error; |
if (output_directive.generator == NULL) { |
@@ -1122,7 +1130,7 @@ bool CommandLineInterface::GenerateOutput( |
if (!GeneratePluginOutput(parsed_files, plugin_name, |
output_directive.parameter, |
- output_directory, &error)) { |
+ generator_context, &error)) { |
cerr << output_directive.name << ": " << error << endl; |
return false; |
} |
@@ -1131,7 +1139,7 @@ bool CommandLineInterface::GenerateOutput( |
for (int i = 0; i < parsed_files.size(); i++) { |
if (!output_directive.generator->Generate( |
parsed_files[i], output_directive.parameter, |
- output_directory, &error)) { |
+ generator_context, &error)) { |
// Generator returned an error. |
cerr << output_directive.name << ": " << parsed_files[i]->name() << ": " |
<< error << endl; |
@@ -1147,7 +1155,7 @@ bool CommandLineInterface::GeneratePluginOutput( |
const vector<const FileDescriptor*>& parsed_files, |
const string& plugin_name, |
const string& parameter, |
- OutputDirectory* output_directory, |
+ GeneratorContext* generator_context, |
string* error) { |
CodeGeneratorRequest request; |
CodeGeneratorResponse response; |
@@ -1190,14 +1198,14 @@ bool CommandLineInterface::GeneratePluginOutput( |
// We reset current_output to NULL first so that the old file is closed |
// before the new one is opened. |
current_output.reset(); |
- current_output.reset(output_directory->OpenForInsert( |
+ current_output.reset(generator_context->OpenForInsert( |
output_file.name(), output_file.insertion_point())); |
} else if (!output_file.name().empty()) { |
// Starting a new file. Open it. |
// We reset current_output to NULL first so that the old file is closed |
// before the new one is opened. |
current_output.reset(); |
- current_output.reset(output_directory->Open(output_file.name())); |
+ current_output.reset(generator_context->Open(output_file.name())); |
} else if (current_output == NULL) { |
*error = strings::Substitute( |
"$0: First file chunk returned by plugin did not specify a file name.", |