[gnome-builder/wip/slaf/xml-pack: 29/56] xml-pack: simplify IdeXmlSymbolNode



commit 5d84a70172b7f48aa614844690e75bb53fa12ccf
Author: Sebastien Lafargue <slafargue gnome org>
Date:   Wed May 17 19:52:54 2017 +0200

    xml-pack: simplify IdeXmlSymbolNode
    
    We simplify the constructor by moving
    location params to a setter.
    
    We add a parent node field, handle automatically
    when using ide_xml_symbol_take_child and
    ide_xml_take_internal_child methods.

 plugins/xml-pack/ide-xml-parser-generic.c |    6 +-
 plugins/xml-pack/ide-xml-parser-ui.c      |   36 ++++++-----------
 plugins/xml-pack/ide-xml-parser.c         |   12 +++---
 plugins/xml-pack/ide-xml-symbol-node.c    |   61 +++++++++++++++--------------
 plugins/xml-pack/ide-xml-symbol-node.h    |    9 +---
 5 files changed, 55 insertions(+), 69 deletions(-)
---
diff --git a/plugins/xml-pack/ide-xml-parser-generic.c b/plugins/xml-pack/ide-xml-parser-generic.c
index 40607de..0d6d307 100644
--- a/plugins/xml-pack/ide-xml-parser-generic.c
+++ b/plugins/xml-pack/ide-xml-parser-generic.c
@@ -67,7 +67,7 @@ ide_xml_parser_generic_start_element_sax_cb (ParserState    *state,
   attr = collect_attributes (self, (const gchar **)attributes);
   label = g_strconcat ((const gchar *)name, attr, NULL);
 
-  node = ide_xml_symbol_node_new (label, NULL, NULL, IDE_SYMBOL_XML_ELEMENT, NULL, 0, 0, 0, 0, 0);
+  node = ide_xml_symbol_node_new (label, NULL, NULL, IDE_SYMBOL_XML_ELEMENT);
   g_object_set (node, "use-markup", TRUE, NULL);
 
   state->attributes = (const gchar **)attributes;
@@ -85,7 +85,7 @@ ide_xml_parser_generic_comment_sax_cb (ParserState   *state,
   g_assert (IDE_IS_XML_PARSER (self));
 
   strip_name = g_strstrip (g_strdup ((const gchar *)name));
-  node = ide_xml_symbol_node_new (strip_name, NULL, NULL, IDE_SYMBOL_XML_COMMENT, NULL, 0, 0, 0, 0, 0);
+  node = ide_xml_symbol_node_new (strip_name, NULL, NULL, IDE_SYMBOL_XML_COMMENT);
   ide_xml_parser_state_processing (self, state, "comment", node, IDE_XML_SAX_CALLBACK_TYPE_COMMENT, FALSE);
 }
 
@@ -99,7 +99,7 @@ ide_xml_parser_generic_cdata_sax_cb (ParserState   *state,
 
   g_assert (IDE_IS_XML_PARSER (self));
 
-  node = ide_xml_symbol_node_new ("cdata", NULL, NULL, IDE_SYMBOL_XML_CDATA, NULL, 0, 0, 0, 0, 0);
+  node = ide_xml_symbol_node_new ("cdata", NULL, NULL, IDE_SYMBOL_XML_CDATA);
   ide_xml_parser_state_processing (self, state, "cdata", node, IDE_XML_SAX_CALLBACK_TYPE_CDATA, FALSE);
 }
 
diff --git a/plugins/xml-pack/ide-xml-parser-ui.c b/plugins/xml-pack/ide-xml-parser-ui.c
index efc5087..450ca17 100644
--- a/plugins/xml-pack/ide-xml-parser-ui.c
+++ b/plugins/xml-pack/ide-xml-parser-ui.c
@@ -65,8 +65,7 @@ ide_xml_parser_ui_start_element_sax_cb (ParserState    *state,
           ide_str_equal0 (parent_name, "template"))
         {
           value = get_attribute (attributes, "name", NULL);
-          node = ide_xml_symbol_node_new (value, NULL, "property",
-                                          IDE_SYMBOL_UI_PROPERTY, NULL, 0, 0, 0, 0, 0);
+          node = ide_xml_symbol_node_new (value, NULL, "property", IDE_SYMBOL_UI_PROPERTY);
           is_internal = TRUE;
           state->build_state = BUILD_STATE_GET_CONTENT;
         }
@@ -78,8 +77,7 @@ ide_xml_parser_ui_start_element_sax_cb (ParserState    *state,
           ide_str_equal0 (parent_name, "item"))
         {
           value = get_attribute (attributes, "name", NULL);
-          node = ide_xml_symbol_node_new (value, NULL, "attribute",
-                                          IDE_SYMBOL_UI_MENU_ATTRIBUTE, NULL, 0, 0, 0, 0, 0);
+          node = ide_xml_symbol_node_new (value, NULL, "attribute", IDE_SYMBOL_UI_MENU_ATTRIBUTE);
           is_internal = TRUE;
           state->build_state = BUILD_STATE_GET_CONTENT;
         }
@@ -87,8 +85,7 @@ ide_xml_parser_ui_start_element_sax_cb (ParserState    *state,
   else if (ide_str_equal0 (name, "class") && ide_str_equal0 (parent_name, "style"))
     {
       value = get_attribute (attributes, "name", NULL);
-      node = ide_xml_symbol_node_new (value, NULL, "class",
-                                      IDE_SYMBOL_UI_STYLE_CLASS, NULL, 0, 0, 0, 0, 0);
+      node = ide_xml_symbol_node_new (value, NULL, "class", IDE_SYMBOL_UI_STYLE_CLASS);
       is_internal = TRUE;
     }
   else if (ide_str_equal0 (name, "child"))
@@ -109,8 +106,7 @@ ide_xml_parser_ui_start_element_sax_cb (ParserState    *state,
           g_string_append (string, value);
         }
 
-      node = ide_xml_symbol_node_new (string->str, NULL, "child",
-                                      IDE_SYMBOL_UI_CHILD, NULL, 0, 0, 0, 0, 0);
+      node = ide_xml_symbol_node_new (string->str, NULL, "child", IDE_SYMBOL_UI_CHILD);
       g_object_set (node, "use-markup", TRUE, NULL);
     }
   else if (ide_str_equal0 (name, "object"))
@@ -128,8 +124,7 @@ ide_xml_parser_ui_start_element_sax_cb (ParserState    *state,
           g_string_append (string, value);
         }
 
-      node = ide_xml_symbol_node_new (string->str, NULL, "object",
-                                      IDE_SYMBOL_UI_OBJECT, NULL, 0, 0, 0, 0, 0);
+      node = ide_xml_symbol_node_new (string->str, NULL, "object", IDE_SYMBOL_UI_OBJECT);
       g_object_set (node, "use-markup", TRUE, NULL);
     }
   else if (ide_str_equal0 (name, "template"))
@@ -145,19 +140,16 @@ ide_xml_parser_ui_start_element_sax_cb (ParserState    *state,
       g_string_append (string, label);
       g_string_append (string, value);
 
-      node = ide_xml_symbol_node_new (string->str, NULL, (const gchar *)name,
-                                      IDE_SYMBOL_UI_TEMPLATE, NULL, 0, 0, 0, 0, 0);
+      node = ide_xml_symbol_node_new (string->str, NULL, (const gchar *)name, IDE_SYMBOL_UI_TEMPLATE);
       g_object_set (node, "use-markup", TRUE, NULL);
     }
   else if (ide_str_equal0 (name, "packing"))
     {
-      node = ide_xml_symbol_node_new ("packing", NULL, "packing",
-                                      IDE_SYMBOL_UI_PACKING, NULL, 0, 0, 0, 0, 0);
+      node = ide_xml_symbol_node_new ("packing", NULL, "packing", IDE_SYMBOL_UI_PACKING);
     }
   else if (ide_str_equal0 (name, "style"))
     {
-      node = ide_xml_symbol_node_new ("style", NULL, "style",
-                                      IDE_SYMBOL_UI_STYLE, NULL, 0, 0, 0, 0, 0);
+      node = ide_xml_symbol_node_new ("style", NULL, "style", IDE_SYMBOL_UI_STYLE);
     }
   else if (ide_str_equal0 (name, "menu"))
     {
@@ -166,8 +158,7 @@ ide_xml_parser_ui_start_element_sax_cb (ParserState    *state,
       g_string_append (string, label);
       g_string_append (string, value);
 
-      node = ide_xml_symbol_node_new (string->str, NULL, "menu",
-                                      IDE_SYMBOL_UI_MENU, NULL, 0, 0, 0, 0, 0);
+      node = ide_xml_symbol_node_new (string->str, NULL, "menu", IDE_SYMBOL_UI_MENU);
       g_object_set (node, "use-markup", TRUE, NULL);
     }
   else if (ide_str_equal0 (name, "submenu"))
@@ -177,8 +168,7 @@ ide_xml_parser_ui_start_element_sax_cb (ParserState    *state,
       g_string_append (string, label);
       g_string_append (string, value);
 
-      node = ide_xml_symbol_node_new (string->str, NULL, "submenu",
-                                      IDE_SYMBOL_UI_SUBMENU, NULL, 0, 0, 0, 0, 0);
+      node = ide_xml_symbol_node_new (string->str, NULL, "submenu", IDE_SYMBOL_UI_SUBMENU);
       g_object_set (node, "use-markup", TRUE, NULL);
     }
   else if (ide_str_equal0 (name, "section"))
@@ -188,14 +178,12 @@ ide_xml_parser_ui_start_element_sax_cb (ParserState    *state,
       g_string_append (string, label);
       g_string_append (string, value);
 
-      node = ide_xml_symbol_node_new (string->str, NULL, "section",
-                                      IDE_SYMBOL_UI_SECTION, NULL, 0, 0, 0, 0, 0);
+      node = ide_xml_symbol_node_new (string->str, NULL, "section", IDE_SYMBOL_UI_SECTION);
       g_object_set (node, "use-markup", TRUE, NULL);
     }
   else if (ide_str_equal0 (name, "item"))
     {
-      node = ide_xml_symbol_node_new ("item", NULL, "item",
-                                      IDE_SYMBOL_UI_ITEM, NULL, 0, 0, 0, 00, 0);
+      node = ide_xml_symbol_node_new ("item", NULL, "item", IDE_SYMBOL_UI_ITEM);
     }
 
   state->attributes = (const gchar **)attributes;
diff --git a/plugins/xml-pack/ide-xml-parser.c b/plugins/xml-pack/ide-xml-parser.c
index 2aad156..02eaf13 100644
--- a/plugins/xml-pack/ide-xml-parser.c
+++ b/plugins/xml-pack/ide-xml-parser.c
@@ -204,11 +204,11 @@ ide_xml_parser_state_processing (IdeXmlParser          *self,
     {
       if (callback_type == IDE_XML_SAX_CALLBACK_TYPE_START_ELEMENT)
         {
-          node = ide_xml_symbol_node_new ("internal", NULL, element_name, IDE_SYMBOL_XML_ELEMENT,
-                                          g_object_ref (state->file),
-                                          start_line, start_line_offset,
-                                          end_line, end_line_offset,
-                                          size);
+          node = ide_xml_symbol_node_new ("internal", NULL, element_name, IDE_SYMBOL_XML_ELEMENT);
+          ide_xml_symbol_node_set_location (node, g_object_ref (state->file),
+                                            start_line, start_line_offset,
+                                            end_line, end_line_offset,
+                                            size);
 
           ide_xml_stack_push (self->stack, element_name, node, state->parent_node, depth);
           ide_xml_symbol_node_take_internal_child (state->parent_node, node);
@@ -576,7 +576,7 @@ ide_xml_parser_get_analysis_async (IdeXmlParser        *self,
   state->build_state = BUILD_STATE_NORMAL;
 
   state->analysis = ide_xml_analysis_new (-1);
-  state->root_node = ide_xml_symbol_node_new ("root", NULL, "root", IDE_SYMBOL_NONE, NULL, 0, 0, 0, 0, 0);
+  state->root_node = ide_xml_symbol_node_new ("root", NULL, "root", IDE_SYMBOL_NONE);
   ide_xml_analysis_set_root_node (state->analysis, state->root_node);
 
   state->parent_node = state->root_node;
diff --git a/plugins/xml-pack/ide-xml-symbol-node.c b/plugins/xml-pack/ide-xml-symbol-node.c
index 6091deb..873d419 100644
--- a/plugins/xml-pack/ide-xml-symbol-node.c
+++ b/plugins/xml-pack/ide-xml-symbol-node.c
@@ -38,18 +38,20 @@ typedef struct _NodeRange
 
 struct _IdeXmlSymbolNode
 {
-  IdeSymbolNode             parent_instance;
-  GArray                   *children;
-  gchar                    *value;
-  gchar                    *element_name;
-  gint                      nb_children;
-  gint                      nb_internal_children;
-  GFile                    *file;
-  gchar                   **attributes_names;
-  NodeRange                 start_tag;
-  NodeRange                 end_tag;
-
-  guint                     has_end_tag : 1;
+  IdeSymbolNode      parent_instance;
+
+  IdeXmlSymbolNode  *parent;
+  GArray            *children;
+  gchar             *value;
+  gchar             *element_name;
+  gint               nb_children;
+  gint               nb_internal_children;
+  GFile             *file;
+  gchar            **attributes_names;
+  NodeRange          start_tag;
+  NodeRange          end_tag;
+
+  guint              has_end_tag : 1;
 };
 
 typedef enum
@@ -116,6 +118,7 @@ ide_xml_symbol_node_finalize (GObject *object)
   g_clear_pointer (&self->value, g_free);
 
   g_clear_object (&self->file);
+  g_clear_object (&self->parent);
 
   if (self->attributes_names != NULL)
     g_strfreev (self->attributes_names);
@@ -144,19 +147,12 @@ IdeXmlSymbolNode *
 ide_xml_symbol_node_new (const gchar            *name,
                          const gchar            *value,
                          const gchar            *element_name,
-                         IdeSymbolKind           kind,
-                         GFile                  *file,
-                         gint                    start_line,
-                         gint                    start_line_offset,
-                         gint                    end_line,
-                         gint                    end_line_offset,
-                         gsize                   size)
+                         IdeSymbolKind           kind)
 {
   IdeXmlSymbolNode *self;
   IdeSymbolFlags flags = IDE_SYMBOL_FLAGS_NONE;
 
   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,
@@ -172,15 +168,6 @@ ide_xml_symbol_node_new (const gchar            *name,
   if (!ide_str_empty0 (value))
     self->value = g_strdup (value);
 
-  if (file != NULL)
-    self->file = g_object_ref (file);
-
-  self->start_tag.start_line = start_line;
-  self->start_tag.start_line_offset = start_line_offset;
-  self->start_tag.end_line = end_line;
-  self->start_tag.end_line_offset = end_line_offset;
-  self->start_tag.size = size;
-
   return self;
 }
 
@@ -400,6 +387,14 @@ take_child (IdeXmlSymbolNode *self,
   node_entry.is_internal = is_internal;
 
   g_array_append_val (self->children, node_entry);
+
+  if (child != self)
+    {
+      if (child->parent != NULL)
+        g_object_unref (child->parent);
+
+      child->parent = g_object_ref (self);
+    }
 }
 
 void
@@ -577,6 +572,14 @@ ide_xml_symbol_node_set_value (IdeXmlSymbolNode *self,
     self->value = g_strdup (value);
 }
 
+IdeXmlSymbolNode *
+ide_xml_symbol_node_get_parent (IdeXmlSymbolNode *self)
+{
+  g_return_val_if_fail (IDE_IS_XML_SYMBOL_NODE (self), NULL);
+
+  return self->parent;
+}
+
 /* Return -1 if before, 0 if in, 1 if after the range */
 static inline gint
 is_in_range (NodeRange range,
diff --git a/plugins/xml-pack/ide-xml-symbol-node.h b/plugins/xml-pack/ide-xml-symbol-node.h
index 26a461d..228e819 100644
--- a/plugins/xml-pack/ide-xml-symbol-node.h
+++ b/plugins/xml-pack/ide-xml-symbol-node.h
@@ -33,13 +33,7 @@ G_DECLARE_FINAL_TYPE (IdeXmlSymbolNode, ide_xml_symbol_node, IDE, XML_SYMBOL_NOD
 IdeXmlSymbolNode         *ide_xml_symbol_node_new                           (const gchar            *name,
                                                                              const gchar            *value,
                                                                              const gchar            
*element_name,
-                                                                             IdeSymbolKind           kind,
-                                                                             GFile                  *file,
-                                                                             gint                    
start_line,
-                                                                             gint                    
start_line_offset,
-                                                                             gint                    
end_line,
-                                                                             gint                    
end_line_offset,
-                                                                             gsize                   size);
+                                                                             IdeSymbolKind           kind);
 IdeXmlPositionKind        ide_xml_symbol_node_compare_location              (IdeXmlSymbolNode       
*ref_node,
                                                                              gint                    line,
                                                                              gint                    
line_offset);
@@ -72,6 +66,7 @@ IdeSymbolNode            *ide_xml_symbol_node_get_nth_direct_child          (Ide
                                                                              guint                   
nth_child);
 IdeSymbolNode            *ide_xml_symbol_node_get_nth_internal_child        (IdeXmlSymbolNode       *self,
                                                                              guint                   
nth_child);
+IdeXmlSymbolNode         *ide_xml_symbol_node_get_parent                    (IdeXmlSymbolNode       *self);
 const gchar              *ide_xml_symbol_node_get_value                     (IdeXmlSymbolNode       *self);
 gboolean                  ide_xml_symbol_node_has_end_tag                   (IdeXmlSymbolNode       *self);
 void                      ide_xml_symbol_node_set_location                  (IdeXmlSymbolNode       *self,


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