Sfoglia il codice sorgente

Use full paths when writing MSVS-style errors. Patch from Oleg Smolsky.

kenton@google.com 15 anni fa
parent
commit
6793c1af26

+ 13 - 3
src/google/protobuf/compiler/command_line_interface.cc

@@ -182,14 +182,23 @@ bool TryCreateParentDirectory(const string& prefix, const string& filename) {
 class CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector,
                                            public io::ErrorCollector {
  public:
-  ErrorPrinter(ErrorFormat format) : format_(format) {}
+  ErrorPrinter(ErrorFormat format, DiskSourceTree *tree = NULL) 
+    : format_(format), tree_(tree) {}
   ~ErrorPrinter() {}
 
   // implements MultiFileErrorCollector ------------------------------
   void AddError(const string& filename, int line, int column,
                 const string& message) {
 
-    cerr << filename;
+    // Print full path when running under MSVS
+    std::string dfile;
+    if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS && 
+        tree_ != NULL &&
+        tree_->VirtualFileToDiskFile(filename, &dfile)) {
+      cerr << dfile;
+    } else {
+      cerr << filename;
+    }
 
     // Users typically expect 1-based line/column numbers, so we add 1
     // to each here.
@@ -215,6 +224,7 @@ class CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector,
 
  private:
   const ErrorFormat format_;
+  DiskSourceTree *tree_;
 };
 
 // -------------------------------------------------------------------
@@ -583,7 +593,7 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) {
   }
 
   // Allocate the Importer.
-  ErrorPrinter error_collector(error_format_);
+  ErrorPrinter error_collector(error_format_, &source_tree);
   Importer importer(&source_tree, &error_collector);
 
   vector<const FileDescriptor*> parsed_files;

+ 1 - 1
src/google/protobuf/compiler/command_line_interface_unittest.cc

@@ -1153,7 +1153,7 @@ TEST_F(CommandLineInterfaceTest, MsvsFormatErrors) {
       "--proto_path=$tmpdir --error_format=msvs foo.proto");
 
   ExpectErrorText(
-    "foo.proto(2) : error in column=1: Expected top-level statement "
+    "$tmpdir/foo.proto(2) : error in column=1: Expected top-level statement "
       "(e.g. \"message\").\n");
 }