[valadoc] gtkdoc: Improve docs for generics



commit 78f50be5f2a781904406eeb45b6bf9dc1ea6221f
Author: Florian Brosch <flo brosch gmail com>
Date:   Thu Feb 7 05:17:30 2013 +0100

    gtkdoc: Improve docs for generics

 src/doclets/gtkdoc/gcomment.vala  |    4 +-
 src/doclets/gtkdoc/generator.vala |  147 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 146 insertions(+), 5 deletions(-)
---
diff --git a/src/doclets/gtkdoc/gcomment.vala b/src/doclets/gtkdoc/gcomment.vala
index ae86792..a23b545 100644
--- a/src/doclets/gtkdoc/gcomment.vala
+++ b/src/doclets/gtkdoc/gcomment.vala
@@ -25,11 +25,13 @@ public class Gtkdoc.Header {
        public string[]? annotations;
        public string? value;
        public double pos;
+       public bool block;
 
-       public Header (string name, string? value = null, double pos = double.MAX) {
+       public Header (string name, string? value = null, double pos = double.MAX, bool block = true) {
                this.name = name;
                this.value = value;
                this.pos = pos;
+               this.block = block;
        }
 
        public int cmp (Header header) {
diff --git a/src/doclets/gtkdoc/generator.vala b/src/doclets/gtkdoc/generator.vala
index 6efd54a..873a592 100644
--- a/src/doclets/gtkdoc/generator.vala
+++ b/src/doclets/gtkdoc/generator.vala
@@ -68,6 +68,24 @@ public class Gtkdoc.Generator : Api.Visitor {
        private DBus.Interface current_dbus_interface;
        private DBus.Member current_dbus_member;
 
+       private string combine_inline_docs (string? str1, string? str2) {
+               StringBuilder builder = new StringBuilder ();
+               if (str1 != null) {
+                       builder.append (str1._chomp ());
+               }
+
+               if (builder.len > 0 && builder.str[builder.len - 1] != '.' && str2 != null) {
+                       builder.append (". ");
+               }
+
+               if (str2 != null) {
+                       builder.append_c (' ');
+                       builder.append (str2);
+               }
+
+               return (owned) builder.str;
+       }
+
        private Api.Node? current_method_or_delegate {
                get {
                        if (current_method != null) {
@@ -180,8 +198,14 @@ public class Gtkdoc.Generator : Api.Visitor {
                        foreach (var lang_header in lang_headers) {
                                if (doc_header.name == lang_header.name) {
                                        header.annotations = lang_header.annotations;
-                                       if (lang_header.value != null) {
+                                       if (lang_header.value == null) {
+                                               continue;
+                                       }
+
+                                       if (lang_header.block) {
                                                header.value += "<para>%s</para>".printf (lang_header.value);
+                                       } else {
+                                               header.value = combine_inline_docs (lang_header.value, 
header.value);
                                        }
                                }
                        }
@@ -271,12 +295,12 @@ public class Gtkdoc.Generator : Api.Visitor {
                return gcomment;
        }
 
-       private Header? add_custom_header (string name, string? comment, string[]? annotations = null, double 
pos = double.MAX) {
+       private Header? add_custom_header (string name, string? comment, string[]? annotations = null, double 
pos = double.MAX, bool block = true) {
                if (comment == null && annotations == null) {
                        return null;
                }
 
-               var header = new Header (name, comment, pos);
+               var header = new Header (name, comment, pos, block);
                header.annotations = annotations;
                current_headers.add (header);
                return header;
@@ -384,6 +408,16 @@ public class Gtkdoc.Generator : Api.Visitor {
                }
 
                add_custom_header ("parent_iface", "the parent interface structure");
+               if (iface.get_attribute ("GenericAccessors") != null) {
+                       var type_parameters = iface.get_children_by_type (NodeType.TYPE_PARAMETER, false);
+                       foreach (Api.Node _type in type_parameters) {
+                               var type = _type as Api.TypeParameter;
+                               string type_name_down = type.name.down ();
+                               add_custom_header ("get_%s_type".printf (type_name_down), "The #GType for 
%s".printf (type_name_down));
+                               add_custom_header ("get_%s_dup_func".printf (type_name_down), "A dup function 
for #%sIface.get_%s_type()".printf (iface.get_cname (), type_name_down));
+                               add_custom_header ("get_%s_destroy_func".printf (type_name_down), "A destroy 
function for #%sIface.get_%s_type()".printf (iface.get_cname (), type_name_down));
+                       }
+               }
                gcomment = add_symbol (iface.get_filename (), iface.get_cname () + "Iface");
                gcomment.brief_comment = "Interface for creating %s implementations.".printf 
(get_docbook_link (iface));
 
@@ -656,6 +690,16 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                var gcomment = add_comment (prop.get_filename(), "%s:%s".printf (current_cname, 
prop.get_cname ()), prop.documentation);
                prop.accept_all_children (this);
 
+               Api.TypeParameter type_parameter = prop.property_type.data_type as Api.TypeParameter;
+               string? return_type_link = null;
+               if (type_parameter != null) {
+                       if (type_parameter.parent is Api.Class) {
+                               return_type_link = "#%s:%s-type".printf (get_cname (prop.parent), 
type_parameter.name.down ());
+                       } else if (type_parameter.parent is Api.Interface && ((Api.Symbol) 
type_parameter.parent).get_attribute ("GenericAccessors") != null) {
+                               return_type_link = "#_%sIface.get_%s_type()".printf (get_cname 
(type_parameter.parent), type_parameter.name.down ());
+                       }
+               }
+
                // Handle attributes for things like deprecation.
                process_attributes (prop, gcomment);
 
@@ -663,6 +707,9 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                        var getter_gcomment = add_symbol (prop.get_filename(), prop.getter.get_cname ());
                        getter_gcomment.headers.add (new Header ("self", "the %s instance to query".printf 
(get_docbook_link (prop.parent)), 1));
                        getter_gcomment.returns = "the value of the %s property".printf (get_docbook_link 
(prop));
+                       if (return_type_link != null) {
+                               getter_gcomment.returns += " of type " + return_type_link;
+                       }
                        getter_gcomment.brief_comment = "Get and return the current value of the %s 
property.".printf (get_docbook_link (prop));
                        getter_gcomment.long_comment = combine_comments (gcomment.brief_comment, 
gcomment.long_comment);
 
@@ -680,7 +727,8 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                if (prop.setter != null && !prop.setter.is_private && prop.setter.is_set) {
                        var setter_gcomment = add_symbol (prop.get_filename(), prop.setter.get_cname ());
                        setter_gcomment.headers.add (new Header ("self", "the %s instance to modify".printf 
(get_docbook_link (prop.parent)), 1));
-                       setter_gcomment.headers.add (new Header ("value", "the new value of the %s 
property".printf (get_docbook_link (prop)), 2));
+                       string type_desc = (return_type_link != null)? " of type " + return_type_link : "";
+                       setter_gcomment.headers.add (new Header ("value", "the new value of the %s 
property%s".printf (get_docbook_link (prop), type_desc), 2));
                        setter_gcomment.brief_comment = "Set the value of the %s property to @value.".printf 
(get_docbook_link (prop));
                        setter_gcomment.long_comment = combine_comments (gcomment.brief_comment, 
gcomment.long_comment);
 
@@ -694,6 +742,11 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                        /* Copy versioning headers such as deprecation and since lines. */
                        setter_gcomment.versioning = gcomment.versioning;
                }
+
+               if (return_type_link != null) {
+                       string return_type_desc = "<para>Holds a value from type #%s:%s-type.</para>".printf 
(get_cname (prop.parent), type_parameter.name.down ());
+                       gcomment.long_comment = combine_inline_docs (return_type_desc, gcomment.long_comment);
+               }
        }
 
        public override void visit_field (Api.Field f) {
@@ -739,6 +792,22 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                }
 
                var gcomment = add_symbol (d.get_filename(), d.get_cname(), d.documentation);
+               Api.TypeParameter type_parameter = d.return_type.data_type as Api.TypeParameter;
+               if (type_parameter != null) {
+                       if (type_parameter.parent is Api.Class) {
+                               string return_type_desc = "A value from type #%s:%s-type.".printf (get_cname 
(d.parent), type_parameter.name.down ());
+                               gcomment.returns = combine_inline_docs (return_type_desc, gcomment.returns);
+                       } else if (type_parameter.parent is Api.Interface && ((Api.Symbol) 
type_parameter.parent).get_attribute ("GenericAccessors") != null) {
+                               string return_type_desc = "A value from type #_%sIface.get_%s_type().".printf 
(get_cname (d.parent), type_parameter.name.down ());
+                               gcomment.returns = combine_inline_docs (return_type_desc, gcomment.returns);
+                       /*
+                       } else if (type_parameter.parent is Api.Struct) {
+                               // type not stored & not allowed
+                       } else if (type_parameter.parent == d) {
+                               // type not available as argument
+                       */
+                       }
+               }
        
                // Handle attributes for things like deprecation.
                process_attributes (d, gcomment);
@@ -772,6 +841,18 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                        current_dbus_interface.add_signal (current_dbus_member);
                }
 
+               Api.TypeParameter type_parameter = sig.return_type.data_type as Api.TypeParameter;
+               if (type_parameter != null) {
+                       if (type_parameter.parent is Api.Class) {
+                               string return_type_desc = "A value from type #%s:%s-type.".printf (get_cname 
(type_parameter.parent), type_parameter.name.down ());
+                               gcomment.returns = combine_inline_docs (return_type_desc, gcomment.returns);
+                       } else if (type_parameter.parent is Api.Interface && ((Api.Symbol) 
type_parameter.parent).get_attribute ("GenericAccessors") != null) {
+                               string return_type_desc = "A value from type #_%sIface.get_%s_type().".printf 
(get_cname (type_parameter.parent), type_parameter.name.down ());
+                               gcomment.returns = combine_inline_docs (return_type_desc, gcomment.returns);
+                       }
+               }
+
+
                // Handle attributes for things like deprecation.
                process_attributes (sig, gcomment);
 
@@ -812,6 +893,28 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                        add_custom_header ("self", "the %s instance".printf (get_docbook_link (m.parent)), 
null, 0.1);
                }
 
+               if (m.is_constructor) {
+                       // parent type parameters:
+                       var type_parameters = ((Api.Node) m.parent).get_children_by_type 
(NodeType.TYPE_PARAMETER, false);
+                       foreach (Api.Node _type in type_parameters) {
+                               var type = _type as Api.TypeParameter;
+                               string type_name_down = type.name.down ();
+                               add_custom_header (type_name_down + "_type", "A #GType");
+                               add_custom_header (type_name_down + "_dup_func", "A dup function for 
@%s_type".printf (type_name_down));
+                               add_custom_header (type_name_down + "_destroy_func", "A destroy function for 
@%s_type".printf (type_name_down));
+                       }
+               }
+
+               // type parameters:
+               var type_parameters = m.get_children_by_type (NodeType.TYPE_PARAMETER, false);
+               foreach (Api.Node _type in type_parameters) {
+                       var type = _type as Api.TypeParameter;
+                       string type_name_down = type.name.down ();
+                       add_custom_header (type_name_down + "_type", "The #GType for @%s".printf 
(type_name_down), null, 0.2);
+                       add_custom_header (type_name_down + "_dup_func", "A dup function for @%s_type".printf 
(type_name_down), null, 0.3);
+                       add_custom_header (type_name_down + "_destroy_func", "A destroy function for 
@%s_type".printf (type_name_down), null, 0.4);
+               }
+
                m.accept_children ({NodeType.FORMAL_PARAMETER, NodeType.TYPE_PARAMETER}, this);
                var exceptions = m.get_children_by_types ({NodeType.ERROR_DOMAIN, NodeType.CLASS});
                foreach (var ex in exceptions) {
@@ -854,6 +957,20 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                current_method = old_method;
                current_dbus_member = old_dbus_member;
 
+               string? return_type_desc = null;
+               Api.TypeParameter type_parameter = m.return_type.data_type as Api.TypeParameter;
+               if (type_parameter != null) {
+                       if (type_parameter.parent is Api.Class) {
+                               return_type_desc = "A value from type #%s:%s-type.".printf (get_cname 
(m.parent), type_parameter.name.down ());
+                       } else if (type_parameter.parent is Api.Interface && ((Api.Symbol) 
type_parameter.parent).get_attribute ("GenericAccessors") != null) {
+                               return_type_desc = "A value from type #_%sIface.get_%s_type().".printf 
(get_cname (m.parent), type_parameter.name.down ());
+                       } else if (type_parameter.parent is Api.Struct) {
+                               // type not stored
+                       } else if (type_parameter.parent == m) {
+                               return_type_desc = "value from type @%s_type.".printf 
(type_parameter.name.down ());
+                       }
+               }
+
                if (m.is_yields) {
                        var finish_gcomment = add_symbol (m.get_filename(), m.get_finish_function_cname (), 
m.documentation);
                        finish_gcomment.headers.clear ();
@@ -869,8 +986,17 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                        var see_also = finish_gcomment.see_also; // vala bug
                        see_also += get_docbook_link (m);
                        finish_gcomment.see_also = see_also;
+
+                       if (return_type_desc != null) {
+                               finish_gcomment.returns = combine_inline_docs (return_type_desc, 
finish_gcomment.returns);
+                       }
+               } else {
+                       if (return_type_desc != null) {
+                               gcomment.returns = combine_inline_docs (return_type_desc, gcomment.returns);
+                       }
                }
 
+
                if (m.is_constructor && !m.get_cname ().has_suffix ("_new")) {
                        // Hide secondary _construct methods from the documentation (the primary _construct 
method is hidden in visit_class())
                        var file_data = get_file_data (m.get_filename ());
@@ -930,6 +1056,19 @@ It is important that your <link linkend=\"GValue\"><type>GValue</type></link> ho
                }
                annotations += direction;
 
+               TypeParameter type_parameter = param.parameter_type.data_type as TypeParameter;
+               if (type_parameter != null) {
+                       if (type_parameter.parent is Api.Class) {
+                               add_custom_header (param_name, "A parameter from type #%s:%s-type.".printf 
(get_cname (type_parameter.parent), type_parameter.name.down ()), null, double.MAX, false);
+                       } else if (type_parameter.parent is Api.Interface && ((Api.Symbol) 
type_parameter.parent).get_attribute ("GenericAccessors") != null) {
+                               add_custom_header (param_name, "A parameter from type 
#_%sIface.get_%s_type().".printf (get_cname (type_parameter.parent), type_parameter.name.down ()), null, 
double.MAX, false);
+                       } else if (type_parameter.parent is Api.Struct) {
+                               // type not stored
+                       } else if (type_parameter.parent is Method) {
+                               add_custom_header (param_name, "A parameter from type @%s_type.".printf 
(type_parameter.name.down ()), null, double.MAX, false);
+                       }
+               }
+
                if (param.parameter_type.is_nullable) {
                        annotations += "allow-none";
                }


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