[gnome-builder/wip/slaf/colored-build-output: 26/36] ide-xml-symbol-node: add internal children and value
- From: Sébastien Lafargue <slafargue src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/slaf/colored-build-output: 26/36] ide-xml-symbol-node: add internal children and value
- Date: Sat, 11 Feb 2017 21:37:56 +0000 (UTC)
commit 3c3877ed57e62477fe7730eedaf0f5e1071ddc17
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]