[gnome-builder] ide-xml-symbol-node: add internal children and value



commit a94eb2fff0380b4146cc1f8e00e0da10128b65ac
Author: Sebastien Lafargue <slafargue gnome org>
Date:   Tue Jan 31 18:13:26 2017 +0100

    ide-xml-symbol-node: add internal children and value
    
    IdeXmlSymbolNode can store internal children nodes.
    Those are nodes containing informations but they are not
    displayed in the symbol tree, the informations will be
    collected and injected in a visible node during
    a post-processing step.
    
    IdeXmlSymbolNode can have a value field in addition to
    its name and element's name.

 plugins/xml-pack/ide-xml-symbol-node.c          |   92 ++++++++++++++++++++---
 plugins/xml-pack/ide-xml-symbol-node.h          |   52 ++++++++------
 plugins/xml-pack/ide-xml-tree-builder-generic.c |    2 +-
 3 files changed, 111 insertions(+), 35 deletions(-)
---
diff --git a/plugins/xml-pack/ide-xml-symbol-node.c b/plugins/xml-pack/ide-xml-symbol-node.c
index 49a9305..9dd8911 100644
--- a/plugins/xml-pack/ide-xml-symbol-node.c
+++ b/plugins/xml-pack/ide-xml-symbol-node.c
@@ -25,11 +25,12 @@ struct _IdeXmlSymbolNode
 {
   IdeSymbolNode             parent_instance;
   GPtrArray                *children;
+  GPtrArray                *internal_children;
+  gchar                    *value;
   gchar                    *element_name;
   GFile                    *file;
   gint                      line;
   gint                      line_offset;
-  gint64                    serial;
 };
 
 G_DEFINE_TYPE (IdeXmlSymbolNode, ide_xml_symbol_node, IDE_TYPE_SYMBOL_NODE)
@@ -43,11 +44,12 @@ ide_xml_symbol_node_get_location_async (IdeSymbolNode       *node,
   IdeXmlSymbolNode *self = (IdeXmlSymbolNode *)node;
   g_autoptr(GTask) task = NULL;
   IdeContext *context;
-  IdeFile *ifile;
+  g_autoptr(IdeFile) ifile = NULL;
   IdeSourceLocation *ret;
 
   g_return_if_fail (IDE_IS_XML_SYMBOL_NODE (self));
   g_return_if_fail (G_IS_FILE (self->file));
+  g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
 
   task = g_task_new (self, cancellable, callback, user_data);
   g_task_set_source_tag (task, ide_xml_symbol_node_get_location_async);
@@ -59,7 +61,7 @@ ide_xml_symbol_node_get_location_async (IdeSymbolNode       *node,
                         NULL);
 
   /* TODO: libxml2 give us the end of a tag, we need to walk back
-   * in the buffer to get the start
+   * in the file content to get the start
    */
   ret = ide_source_location_new (ifile, self->line - 1, self->line_offset - 1, 0);
 
@@ -83,7 +85,12 @@ ide_xml_symbol_node_finalize (GObject *object)
   IdeXmlSymbolNode *self = (IdeXmlSymbolNode *)object;
 
   g_clear_pointer (&self->children, g_ptr_array_unref);
-  g_free (self->element_name);
+  g_clear_pointer (&self->internal_children, g_ptr_array_unref);
+
+  g_clear_pointer (&self->element_name, g_free);
+  g_clear_pointer (&self->value, g_free);
+
+  g_clear_object (&self->file);
 
   G_OBJECT_CLASS (ide_xml_symbol_node_parent_class)->finalize (object);
 }
@@ -107,6 +114,7 @@ ide_xml_symbol_node_init (IdeXmlSymbolNode *self)
 
 IdeXmlSymbolNode *
 ide_xml_symbol_node_new (const gchar            *name,
+                         const gchar            *value,
                          const gchar            *element_name,
                          IdeSymbolKind           kind,
                          GFile                  *file,
@@ -116,8 +124,8 @@ ide_xml_symbol_node_new (const gchar            *name,
   IdeXmlSymbolNode *self;
   IdeSymbolFlags flags = IDE_SYMBOL_FLAGS_NONE;
 
-  g_assert (!ide_str_empty0 (name));
-  g_assert (G_IS_FILE (file)|| file == NULL);
+  g_return_val_if_fail (!ide_str_empty0 (name), NULL);
+  g_return_val_if_fail (G_IS_FILE (file)|| file == NULL, NULL);
 
   self = g_object_new (IDE_TYPE_XML_SYMBOL_NODE,
                        "name", name,
@@ -130,6 +138,9 @@ ide_xml_symbol_node_new (const gchar            *name,
   else
     self->element_name = g_strdup (element_name);
 
+  if (!ide_str_empty0 (value))
+    self->value = g_strdup (value);
+
   if (file != NULL)
     self->file = g_object_ref (file);
 
@@ -156,6 +167,28 @@ ide_xml_symbol_node_get_nth_child (IdeXmlSymbolNode *self,
   if (self->children != NULL && nth_child < self->children->len)
     return g_object_ref (g_ptr_array_index (self->children, nth_child));
 
+  g_warning ("nth child %u is out of bounds", nth_child);
+  return NULL;
+}
+
+guint
+ide_xml_symbol_node_get_n_internal_children (IdeXmlSymbolNode *self)
+{
+  g_return_val_if_fail (IDE_IS_XML_SYMBOL_NODE (self), 0);
+
+  return self->internal_children != NULL ? self->internal_children->len : 0;
+}
+
+IdeSymbolNode *
+ide_xml_symbol_node_get_nth_internal_child (IdeXmlSymbolNode *self,
+                                            guint             nth_child)
+{
+  g_return_val_if_fail (IDE_IS_XML_SYMBOL_NODE (self), NULL);
+
+  if (self->internal_children != NULL && nth_child < self->internal_children->len)
+    return g_object_ref (g_ptr_array_index (self->internal_children, nth_child));
+
+  g_warning ("nth child %u is out of bounds", nth_child);
   return NULL;
 }
 
@@ -172,12 +205,17 @@ ide_xml_symbol_node_take_child (IdeXmlSymbolNode *self,
   g_ptr_array_add (self->children, child);
 }
 
-gint64
-ide_xml_symbol_node_get_serial (IdeXmlSymbolNode *self)
+void
+ide_xml_symbol_node_take_internal_child (IdeXmlSymbolNode *self,
+                                         IdeXmlSymbolNode *child)
 {
-  g_return_val_if_fail (IDE_IS_XML_SYMBOL_NODE (self), -1);
+  g_return_if_fail (IDE_IS_XML_SYMBOL_NODE (self));
+  g_return_if_fail (IDE_IS_XML_SYMBOL_NODE (child));
+
+  if (self->internal_children == NULL)
+    self->internal_children = g_ptr_array_new_with_free_func (g_object_unref);
 
-  return self->serial;
+  g_ptr_array_add (self->internal_children, child);
 }
 
 void
@@ -197,6 +235,14 @@ ide_xml_symbol_node_set_location (IdeXmlSymbolNode *self,
   self->line_offset = line_offset;
 }
 
+/**
+ * ide_xml_symbol_node_get_location:
+ * @self: An #IdeXmlSymbolNode.
+ *
+ * Gets the location of an xml node.
+ *
+ * Returns: (transfer none): Gets the location of an xml node.
+ */
 GFile *
 ide_xml_symbol_node_get_location (IdeXmlSymbolNode *self,
                                   gint             *line,
@@ -228,6 +274,28 @@ ide_xml_symbol_node_set_element_name (IdeXmlSymbolNode *self,
   g_return_if_fail (IDE_IS_XML_SYMBOL_NODE (self));
   g_return_if_fail (!ide_str_empty0 (element_name));
 
-  g_free (self->element_name);
-  self->element_name = g_strdup (element_name);
+  g_clear_pointer (&self->element_name, g_free);
+
+  if (element_name != NULL)
+    self->element_name = g_strdup (element_name);
+}
+
+const gchar *
+ide_xml_symbol_node_get_value (IdeXmlSymbolNode *self)
+{
+  g_return_val_if_fail (IDE_IS_XML_SYMBOL_NODE (self), NULL);
+
+  return self->value;
+}
+
+void
+ide_xml_symbol_node_set_value (IdeXmlSymbolNode *self,
+                               const gchar      *value)
+{
+  g_return_if_fail (IDE_IS_XML_SYMBOL_NODE (self));
+
+  g_clear_pointer (&self->value, g_free);
+
+  if (value != NULL)
+    self->value = g_strdup (value);
 }
diff --git a/plugins/xml-pack/ide-xml-symbol-node.h b/plugins/xml-pack/ide-xml-symbol-node.h
index 82bda7f..ba113a7 100644
--- a/plugins/xml-pack/ide-xml-symbol-node.h
+++ b/plugins/xml-pack/ide-xml-symbol-node.h
@@ -29,28 +29,36 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (IdeXmlSymbolNode, ide_xml_symbol_node, IDE, XML_SYMBOL_NODE, IdeSymbolNode)
 
-IdeXmlSymbolNode         *ide_xml_symbol_node_new              (const gchar            *name,
-                                                                const gchar            *element_name,
-                                                                IdeSymbolKind           kind,
-                                                                GFile                  *file,
-                                                                gint                    line,
-                                                                gint                    line_offset);
-void                      ide_xml_symbol_node_take_child       (IdeXmlSymbolNode       *self,
-                                                                IdeXmlSymbolNode       *child);
-const gchar              *ide_xml_symbol_node_get_element_name (IdeXmlSymbolNode       *self);
-GFile *                   ide_xml_symbol_node_get_location     (IdeXmlSymbolNode       *self,
-                                                                gint                   *line,
-                                                                gint                   *line_offset);
-guint                     ide_xml_symbol_node_get_n_children   (IdeXmlSymbolNode       *self);
-IdeSymbolNode            *ide_xml_symbol_node_get_nth_child    (IdeXmlSymbolNode       *self,
-                                                                guint                   nth_child);
-gint64                    ide_xml_symbol_node_get_serial       (IdeXmlSymbolNode       *self);
-void                      ide_xml_symbol_node_set_location     (IdeXmlSymbolNode       *self,
-                                                                GFile                  *file,
-                                                                gint                    line,
-                                                                gint                    line_offset);
-void                      ide_xml_symbol_node_set_element_name (IdeXmlSymbolNode       *self,
-                                                                const gchar            *element_name);
+IdeXmlSymbolNode         *ide_xml_symbol_node_new                           (const gchar            *name,
+                                                                             const gchar            *value,
+                                                                             const gchar            
*element_name,
+                                                                             IdeSymbolKind           kind,
+                                                                             GFile                  *file,
+                                                                             gint                    line,
+                                                                             gint                    
line_offset);
+void                      ide_xml_symbol_node_take_child                    (IdeXmlSymbolNode       *self,
+                                                                             IdeXmlSymbolNode       *child);
+void                      ide_xml_symbol_node_take_internal_child           (IdeXmlSymbolNode       *self,
+                                                                             IdeXmlSymbolNode       *child);
+const gchar              *ide_xml_symbol_node_get_element_name              (IdeXmlSymbolNode       *self);
+GFile *                   ide_xml_symbol_node_get_location                  (IdeXmlSymbolNode       *self,
+                                                                             gint                   *line,
+                                                                             gint                   
*line_offset);
+guint                     ide_xml_symbol_node_get_n_children                (IdeXmlSymbolNode       *self);
+guint                     ide_xml_symbol_node_get_n_internal_children       (IdeXmlSymbolNode       *self);
+IdeSymbolNode            *ide_xml_symbol_node_get_nth_child                 (IdeXmlSymbolNode       *self,
+                                                                             guint                   
nth_child);
+IdeSymbolNode            *ide_xml_symbol_node_get_nth_internal_child        (IdeXmlSymbolNode       *self,
+                                                                             guint                   
nth_child);
+const gchar              *ide_xml_symbol_node_get_value                     (IdeXmlSymbolNode       *self);
+void                      ide_xml_symbol_node_set_location                  (IdeXmlSymbolNode       *self,
+                                                                             GFile                  *file,
+                                                                             gint                    line,
+                                                                             gint                    
line_offset);
+void                      ide_xml_symbol_node_set_element_name              (IdeXmlSymbolNode       *self,
+                                                                             const gchar            
*element_name);
+void                      ide_xml_symbol_node_set_value                     (IdeXmlSymbolNode       *self,
+                                                                             const gchar            *value);
 
 G_END_DECLS
 
diff --git a/plugins/xml-pack/ide-xml-tree-builder-generic.c b/plugins/xml-pack/ide-xml-tree-builder-generic.c
index 11376ce..69ba991 100644
--- a/plugins/xml-pack/ide-xml-tree-builder-generic.c
+++ b/plugins/xml-pack/ide-xml-tree-builder-generic.c
@@ -31,7 +31,7 @@ create_node_from_reader (XmlReader *reader)
 
   name = xml_reader_get_name (reader);
 
-  return ide_xml_symbol_node_new (name, NULL,
+  return ide_xml_symbol_node_new (name, NULL, NULL,
                                   IDE_SYMBOL_UI_OBJECT,
                                   file, line, line_offset);
 }


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