[g-ir-compiler] Slightly less lame error messages
authorColin Walters <walters@verbum.org>
Thu, 11 Feb 2010 22:18:28 +0000 (17:18 -0500)
committerColin Walters <walters@verbum.org>
Thu, 11 Feb 2010 22:18:28 +0000 (17:18 -0500)
To make things really better we should track the line origin of
element from the .gir file (and actually we need to do better
checking in the scanner), but this is slightly less lame.

girepository/girmodule.c
girepository/girmodule.h
girepository/girnode.c
girepository/giroffsets.c

index bf1e856bbb8076fc7dc8d21ad912dc70c243de98..b954d15de719a80a66a003cfac7a9f71978e50dd 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include "girmodule.h"
 #include "girnode.h"
@@ -75,6 +76,39 @@ g_ir_module_free (GIrModule *module)
   g_free (module);
 }
 
+/**
+ * g_ir_module_fatal:
+ * @module: Current module
+ * @line: Origin line number, or 0 if unknown
+ * @msg: printf-format string
+ * @args: Remaining arguments
+ *
+ * Report a fatal error, then exit.
+ */
+void
+g_ir_module_fatal (GIrModule  *module,
+                   guint       line,
+                   const char *msg,
+                   ...)
+{
+  char *formatted;
+
+  va_list args;
+  
+  va_start (args, msg);
+  
+  formatted = g_strdup_vprintf (msg, args);
+  
+  if (line)
+    g_printerr ("%s-%s.gir:%d: error: %s\n", module->name, module->version, line, formatted);
+  else
+    g_printerr ("%s-%s.gir: error: %s\n", module->name, module->version, formatted);
+    
+  exit (1);
+  
+  va_end (args);
+}
+
 static void
 add_alias_foreach (gpointer key,
                   gpointer value,
index 5a558c359a706394b6c72b474399fa953b9fc86d..da3fb35ddd5d670f68750385bfc9011738d76f98 100644 (file)
@@ -61,6 +61,8 @@ void       g_ir_module_add_include_module (GIrModule  *module,
 GTypelib * g_ir_module_build_typelib  (GIrModule  *module,
                                       GList       *modules);
 
+void       g_ir_module_fatal (GIrModule  *module, guint line, const char *msg, ...) G_GNUC_PRINTF (3, 4) G_GNUC_NORETURN;
+
 void _g_irnode_init_stats (void);
 void _g_irnode_dump_stats (void);
 
index 9f6234532c204d87e8c67830c1e115b8cb4e0a8a..2523ee1f1954c0cfa4f0bc3e8e2870e9c2ac4fec 100644 (file)
@@ -1090,7 +1090,7 @@ find_entry_node (GIrModule   *module,
       goto out;
     }
 
-  g_warning ("Entry '%s' not found", name);
+  g_ir_module_fatal (module, 0, "Type reference '%s' not found", name);
 
  out:
 
index 96ff5764883cfc16ff0fbd70ad4358c19f34e4ba..dcfd75e578b3d0c744f6b1c23521368036a705a0 100644 (file)
@@ -156,7 +156,7 @@ get_interface_size_alignment (GIrNodeType *type,
 
   if (!g_ir_find_node (module, modules, type->interface, &iface, &iface_module))
     {
-      g_warning ("Can't resolve type '%s' for %s", type->interface, who);
+      g_ir_module_fatal (module, 0, "Can't resolve type '%s' for %s", type->interface, who);
       *size = -1;
       *alignment = -1;
       return FALSE;