Made flatc error messages look like what other compilers output.
authorWouter van Oortmerssen <wvo@google.com>
Tue, 23 Sep 2014 00:17:13 +0000 (17:17 -0700)
committerWouter van Oortmerssen <wvo@google.com>
Wed, 24 Sep 2014 00:19:01 +0000 (17:19 -0700)
Looks like MSVC on Windows and like gcc everywhere else.
For enhanced IDE clickability.

Bug: 17208371
Change-Id: Ie3e02658fccd3edfd464b4bacf4bc68c613a8570
Tested: on Linux and Windows.

include/flatbuffers/util.h
src/flatc.cpp
src/idl_parser.cpp
tests/monster_test.fbs

index b6bc78a..fa3fc4e 100644 (file)
 #include <stdlib.h>
 #include <assert.h>
 #ifdef _WIN32
+#ifndef WIN32_LEAN_AND_MEAN
+  #define WIN32_LEAN_AND_MEAN
+#endif
+#ifndef NOMINMAX
+  #define NOMINMAX
+#endif
+#include <windows.h>
+#include <winbase.h>
 #include <direct.h>
 #else
 #include <sys/stat.h>
+#include <limits.h>
 #endif
 
 namespace flatbuffers {
@@ -157,6 +166,20 @@ inline void EnsureDirExists(const std::string &filepath) {
   #endif
 }
 
+// Obtains the absolute path from any other path.
+// Returns the input path if the absolute path couldn't be resolved.
+inline std::string AbsolutePath(const std::string &filepath) {
+  #ifdef _WIN32
+    char abs_path[MAX_PATH];
+    return GetFullPathNameA(filepath.c_str(), MAX_PATH, abs_path, nullptr)
+  #else
+    char abs_path[PATH_MAX];
+    return realpath(filepath.c_str(), abs_path)
+  #endif
+    ? abs_path
+    : filepath;
+}
+
 // To and from UTF-8 unicode conversion functions
 
 // Convert a unicode code point into a UTF-8 representation by appending it
index dc697ec..f027dbb 100755 (executable)
@@ -19,7 +19,7 @@
 #include "flatbuffers/util.h"
 
 static void Error(const char *err, const char *obj = nullptr,
-                  bool usage = false);
+                  bool usage = false, bool show_exe_name = true);
 
 namespace flatbuffers {
 
@@ -89,8 +89,10 @@ const Generator generators[] = {
 
 const char *program_name = NULL;
 
-static void Error(const char *err, const char *obj, bool usage) {
-  printf("%s: %s", program_name, err);
+static void Error(const char *err, const char *obj, bool usage,
+                  bool show_exe_name) {
+  if (show_exe_name) printf("%s: ", program_name);
+  printf("%s", err);
   if (obj) printf(": %s", obj);
   printf("\n");
   if (usage) {
@@ -196,7 +198,7 @@ int main(int argc, const char *argv[]) {
         include_directories.push_back(nullptr);
         if (!parser.Parse(contents.c_str(), &include_directories[0],
                           file_it->c_str()))
-          Error((*file_it + ": " + parser.error_).c_str());
+          Error(parser.error_.c_str(), nullptr, false, false);
         include_directories.pop_back();
         include_directories.pop_back();
       }
index 0306773..50973b4 100644 (file)
@@ -907,7 +907,7 @@ bool Parser::Parse(const char *source, const char **include_paths,
         // included_files_.
         // This is recursive, but only go as deep as the number of include
         // statements.
-        return Parse(source, include_paths);
+        return Parse(source, include_paths, source_filename);
       }
       Expect(';');
     }
@@ -981,7 +981,14 @@ bool Parser::Parse(const char *source, const char **include_paths,
       }
     }
   } catch (const std::string &msg) {
-    error_ = "line " + NumToString(line_) + ": " + msg;
+    error_ = source_filename ? AbsolutePath(source_filename) : "";
+    #ifdef _WIN32
+      error_ += "(" + NumToString(line_) + ")";  // MSVC alike
+    #else
+      if (source_filename) error_ += ":";
+      error_ += NumToString(line_) + ":0";  // gcc alike
+    #endif
+    error_ += ": error: " + msg;
     return false;
   }
   assert(!struct_stack_.size());
index 62dff9e..5035252 100755 (executable)
@@ -1,4 +1,4 @@
-// example IDL file
+// test schema file
 
 include "include_test1.fbs";