[gtk+] GtkBuilder: Report more lookup failures as GError



commit d58500b3180492cc9396fdf8dcbf61b29f7f7464
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Apr 29 15:19:31 2015 -0400

    GtkBuilder: Report more lookup failures as GError
    
    Report failures to lookup objects for property values
    and bindings via GError too, and provide location information
    while doing so.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=748234

 gtk/gtkbuilder.c        |   40 ++++++++++++++++++++++++++++++++--------
 gtk/gtkbuilderparser.c  |   42 +++++++++++-------------------------------
 gtk/gtkbuilderprivate.h |    6 ++++++
 3 files changed, 49 insertions(+), 39 deletions(-)
---
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index 60b3b9a..521159a 100644
--- a/gtk/gtkbuilder.c
+++ b/gtk/gtkbuilder.c
@@ -445,6 +445,8 @@ typedef struct
   gchar *object;
   GParamSpec *pspec;
   gchar *value;
+  gint line;
+  gint col;
 } DelayedProperty;
 
 static void
@@ -496,6 +498,8 @@ gtk_builder_get_parameters (GtkBuilder  *builder,
               property->pspec = prop->pspec;
               property->object = g_strdup (object_name);
               property->value = g_strdup (prop->data);
+              property->line = prop->line;
+              property->col = prop->col;
               builder->priv->delayed_properties =
                 g_slist_prepend (builder->priv->delayed_properties, property);
               continue;
@@ -899,12 +903,9 @@ gtk_builder_apply_delayed_properties (GtkBuilder *builder)
       object = g_hash_table_lookup (builder->priv->objects, property->object);
       g_assert (object != NULL);
 
-      obj = g_hash_table_lookup (builder->priv->objects, property->value);
+      obj = _gtk_builder_lookup_object (builder, property->value, property->line, property->col);
       if (obj)
         g_object_set (object, property->pspec->name, obj, NULL);
-      else
-        g_warning ("No object called: %s", property->value);
-
 
       g_free (property->value);
       g_free (property->object);
@@ -933,13 +934,11 @@ gtk_builder_create_bindings (GtkBuilder *builder)
       BindingInfo *info = l->data;
       GObject *source;
 
-      if ((source = gtk_builder_get_object (builder, info->source)))
+      source = _gtk_builder_lookup_object (builder, info->source, info->line, info->col);
+      if (source)
         g_object_bind_property (source, info->source_property,
                                 info->target, info->target_pspec->name,
                                 info->flags);
-      else
-        g_warning ("Could not find source object '%s' to bind property '%s'",
-                   info->source, info->source_property);
 
       free_binding_info (info, NULL);
     }
@@ -2746,3 +2745,28 @@ _gtk_builder_lookup_object (GtkBuilder  *builder,
 
   return obj;
 }
+
+/*< private >
+ * _gtk_builder_lookup_failed:
+ * @GtkBuilder: a #GtkBuilder
+ * @error: return location for error
+ *
+ * Finds whether any object lookups have failed.
+ *
+ * Returns: %TRUE if @error has been set
+ */
+gboolean
+_gtk_builder_lookup_failed (GtkBuilder  *builder,
+                            GError     **error)
+{
+  GError *lookup_error;
+
+  lookup_error = (GError*) g_object_steal_data (G_OBJECT (builder), "lookup-error");
+  if (lookup_error)
+    {
+      g_propagate_error (error, lookup_error);
+      return TRUE;
+    }
+
+  return FALSE;
+}
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c
index d90038a..845d805 100644
--- a/gtk/gtkbuilderparser.c
+++ b/gtk/gtkbuilderparser.c
@@ -700,6 +700,7 @@ parse_property (ParserData   *data,
       binfo->source = g_strdup (bind_source);
       binfo->source_property = g_strdup (bind_property);
       binfo->flags = bind_flags;
+      g_markup_parse_context_get_position (data->ctx, &binfo->line, &binfo->col);
 
       object_info->bindings = g_slist_prepend (object_info->bindings, binfo);
     }
@@ -720,6 +721,7 @@ parse_property (ParserData   *data,
   state_push (data, info);
 
   info->tag.name = element_name;
+  g_markup_parse_context_get_position (data->ctx, &info->line, &info->col);
 }
 
 static void
@@ -941,8 +943,6 @@ subparser_end (GMarkupParseContext *context,
               ParserData          *data,
               GError             **error)
 {
-  GError *lookup_error;
-
   if (data->subparser->parser->end_element)
     data->subparser->parser->end_element (context, element_name,
                                          data->subparser->data, error);
@@ -953,8 +953,6 @@ subparser_end (GMarkupParseContext *context,
   if (strcmp (data->subparser->start, element_name) != 0)
     return;
 
-  g_object_set_data (G_OBJECT (data->builder), "lookup-error", NULL);
-
   gtk_buildable_custom_tag_end (GTK_BUILDABLE (data->subparser->object),
                                data->builder,
                                data->subparser->child,
@@ -962,12 +960,8 @@ subparser_end (GMarkupParseContext *context,
                                data->subparser->data);
   g_free (data->subparser->parser);
 
-  lookup_error = (GError*) g_object_steal_data (G_OBJECT (data->builder), "lookup-error");
-  if (lookup_error)
-    {
-      g_propagate_error (error, lookup_error);
-      return;
-    }
+  if (_gtk_builder_lookup_failed (data->builder, error))
+    return;
 
   if (GTK_BUILDABLE_GET_IFACE (data->subparser->object)->custom_finished)
     data->custom_finalizers = g_slist_prepend (data->custom_finalizers,
@@ -1352,7 +1346,7 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
   const gchar* domain;
   ParserData *data;
   GSList *l;
-  
+
   /* Store the original domain so that interface domain attribute can be
    * applied for the builder and the original domain can be restored after
    * parsing has finished. This allows subparsers to translate elements with
@@ -1393,28 +1387,22 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
     goto out;
 
   _gtk_builder_finish (builder);
+  if (_gtk_builder_lookup_failed (builder, error))
+    goto out;
 
   /* Custom parser_finished */
   data->custom_finalizers = g_slist_reverse (data->custom_finalizers);
   for (l = data->custom_finalizers; l; l = l->next)
     {
       SubParser *sub = (SubParser*)l->data;
-      GError *lookup_error;
-
-      g_object_set_data (G_OBJECT (builder), "lookup-error", NULL);
 
       gtk_buildable_custom_finished (GTK_BUILDABLE (sub->object),
                                      builder,
                                      sub->child,
                                      sub->tagname,
                                      sub->data);
-
-      lookup_error = (GError*) g_object_steal_data (G_OBJECT (builder), "lookup-error");
-      if (lookup_error)
-        {
-          g_propagate_error (error, lookup_error);
-          goto out;
-        }
+      if (_gtk_builder_lookup_failed (builder, error))
+        goto out;
     }
 
   /* Common parser_finished, for all created objects */
@@ -1422,18 +1410,10 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
   for (l = data->finalizers; l; l = l->next)
     {
       GtkBuildable *buildable = (GtkBuildable*)l->data;
-      GError *lookup_error;
-
-      g_object_set_data (G_OBJECT (builder), "lookup-error", NULL);
 
       gtk_buildable_parser_finished (GTK_BUILDABLE (buildable), builder);
-
-      lookup_error = (GError*) g_object_steal_data (G_OBJECT (builder), "lookup-error");
-      if (lookup_error)
-        {
-          g_propagate_error (error, lookup_error);
-          goto out;
-        }
+      if (_gtk_builder_lookup_failed (builder, error))
+        goto out;
     }
 
  out:
diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h
index ee457c1..2a539eb 100644
--- a/gtk/gtkbuilderprivate.h
+++ b/gtk/gtkbuilderprivate.h
@@ -66,6 +66,8 @@ typedef struct {
   gboolean translatable:1;
   gboolean bound:1;
   gchar *context;
+  gint line;
+  gint col;
 } PropertyInfo;
 
 typedef struct {
@@ -85,6 +87,8 @@ typedef struct
   gchar *source;
   gchar *source_property;
   GBindingFlags flags;
+  gint line;
+  gint col;
 } BindingInfo;
 
 typedef struct {
@@ -201,6 +205,8 @@ GObject * _gtk_builder_lookup_object      (GtkBuilder           *builder,
                                            const gchar          *name,
                                            gint                  line,
                                            gint                  col);
+gboolean _gtk_builder_lookup_failed       (GtkBuilder           *builder,
+                                           GError              **error);
 
 
 #endif /* __GTK_BUILDER_PRIVATE_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]