]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
docbook: improve implicit parameter handling
authorFlorian Brosch <flo.brosch@gmail.com>
Wed, 20 Aug 2014 23:01:17 +0000 (01:01 +0200)
committerFlorian Brosch <flo.brosch@gmail.com>
Fri, 29 Aug 2014 13:51:59 +0000 (15:51 +0200)
src/libvaladoc/documentation/gtkdoccommentparser.vala
src/libvaladoc/documentation/gtkdocmarkdownparser.vala
src/libvaladoc/documentation/importerhelper.vala

index bb2d50005a4f5fc943cd147b741d599eef86cd39..417590be8e516e1ad3220794ae2097e90433ec2a 100644 (file)
@@ -38,6 +38,7 @@ public class Valadoc.Gtkdoc.Parser : Object, ResourceLocator {
        private ErrorReporter reporter;
        private Settings settings;
        private Api.Tree tree;
+       private Api.Node? element;
 
        private bool show_warnings;
        private Api.SourceComment comment;
@@ -113,8 +114,6 @@ public class Valadoc.Gtkdoc.Parser : Object, ResourceLocator {
                }
        }
 
-       private Api.Node? element;
-
        public Comment? parse (Api.Node element, Api.GirSourceComment gir_comment, GirMetaData gir_metadata) {
                this.instance_param_name = gir_comment.instance_param_name;
                this.current_metadata = gir_metadata;
@@ -1415,101 +1414,6 @@ public class Valadoc.Gtkdoc.Parser : Object, ResourceLocator {
                }
        }
 
-       private string[]? split_type_name (string id) {
-               unichar c;
-
-               for (unowned string pos = id; (c = pos.get_char ()) != '\0'; pos = pos.next_char ()) {
-                       switch (c) {
-                       case '-': // ->
-                               return {id.substring (0, (long) (((char*) pos) - ((char*) id))), "->", (string) (((char*) pos) + 2)};
-
-                       case ':': // : or ::
-                               string sep = (pos.next_char ().get_char () == ':')? "::" : ":";
-                               return {id.substring (0, (long) (((char*) pos) - ((char*) id))), sep, (string) (((char*) pos) + sep.length)};
-
-                       case '.':
-                               return {id.substring (0, (long) (((char*) pos) - ((char*) id))), ".", (string) (((char*) pos) + 1)};
-                       }
-               }
-
-               return {id};
-       }
-
-       private string? resolve_parameter_ctype (string parameter_name, out string? param_name,
-                                                                                        out string? param_array_name, out bool is_return_type_len)
-       {
-               string[]? parts = split_type_name (parameter_name);
-               is_return_type_len = false;
-               param_array_name = null;
-
-               Api.FormalParameter? param = null; // type parameter or formal parameter
-               foreach (Api.Node node in this.element.get_children_by_type (Api.NodeType.FORMAL_PARAMETER, false)) {
-                       if (node.name == parts[0]) {
-                               param = node as Api.FormalParameter;
-                               break;
-                       }
-
-                       if (((Api.FormalParameter) node).implicit_array_length_cparameter_name == parts[0]) {
-                               param_array_name = ((Api.FormalParameter) node).name;
-                               break;
-                       }
-               }
-
-               if (this.element is Api.Callable
-                       && ((Api.Callable) this.element).implicit_array_length_cparameter_name == parts[0])
-               {
-                       is_return_type_len = true;
-               }
-
-               if (parts.length == 1) {
-                       param_name = parameter_name;
-                       return null;
-               }
-
-
-               Api.Item? inner = null;
-
-               if (param_array_name != null || is_return_type_len) {
-                       inner = tree.search_symbol_str (null, "int");
-               } else if (param != null) {
-                       inner = param.parameter_type;
-               }
-
-               while (inner != null) {
-                       if (inner is Api.TypeReference) {
-                               inner = ((Api.TypeReference) inner).data_type;
-                       } else if (inner is Api.Pointer) {
-                               inner = ((Api.Pointer) inner).data_type;
-                       } else if (inner is Api.Array) {
-                               inner = ((Api.Array) inner).data_type;
-                       } else {
-                               break ;
-                       }
-               }
-
-
-               if (inner == null) {
-                       param_name = parameter_name;
-                       return null;
-               }
-
-               string? cname = null;
-               if (inner is Api.ErrorDomain) {
-                       cname = ((Api.ErrorDomain) inner).get_cname ();
-               } else if (inner is Api.Struct) {
-                       cname = ((Api.Struct) inner).get_cname ();
-               } else if (inner is Api.Class) {
-                       cname = ((Api.Class) inner).get_cname ();
-               } else if (inner is Api.Enum) {
-                       cname = ((Api.Enum) inner).get_cname ();
-               } else {
-                       assert_not_reached ();
-               }
-
-               param_name = (owned) parts[0];
-               return "c::" + cname + parts[1] + parts[2];
-       }
-
        private Run parse_inline_content () {
                Run run = factory.create_run (Run.Style.NONE);
 
@@ -1600,7 +1504,14 @@ public class Valadoc.Gtkdoc.Parser : Object, ResourceLocator {
                                        bool is_return_type_len;
                                        string? param_name;
 
-                                       string? cname = resolve_parameter_ctype (current.content, out param_name, out param_array_name, out is_return_type_len);
+                                       string? cname = ImporterHelper.resolve_parameter_ctype (
+                                               this.tree,
+                                               this.element,
+                                               current.content,
+                                               out param_name,
+                                               out param_array_name,
+                                               out is_return_type_len);
+
                                        Run current_run = factory.create_run (Run.Style.MONOSPACED);
                                        run.content.add (current_run);
 
index 9614e6c82009ad68ed10b859ee723ba8013234b9..341dff050f8980404d36a8dc7a266c23986924b5 100644 (file)
@@ -86,8 +86,33 @@ public class Valadoc.Gtkdoc.MarkdownParser : Object, ResourceLocator {
                                        _run = _factory.create_run (Run.Style.LANG_KEYWORD);
                                        _run.content.add (_factory.create_text ("throws"));
                                } else {
+                                       string? param_name;
+                                       string? param_array_name;
+                                       bool is_return_type_len;
+
+                                       ImporterHelper.resolve_parameter_ctype (
+                                               this._tree,
+                                               this.element,
+                                               token.value,
+                                               out param_name,
+                                               out param_array_name,
+                                               out is_return_type_len);
+
                                        _run = _factory.create_run (Run.Style.MONOSPACED);
-                                       _run.content.add (_factory.create_text (token.value));
+
+                                       if (is_return_type_len) {
+                                               Run keyword_run = _factory.create_run (Run.Style.LANG_KEYWORD);
+                                               keyword_run.content.add (_factory.create_text ("return"));
+                                               _run.content.add (keyword_run);
+
+                                               _run.content.add (_factory.create_text (".length"));
+                                       } else if (param_array_name != null) {
+                                               _run.content.add (_factory.create_text (param_array_name + ".length"));
+                                       } else {
+                                               _run.content.add (_factory.create_text (param_name));
+                                       }
+
+
                                }
 
                                push (_run);
index 36ed06dfe016d3eb6a08a168c8f71761fdcf9c3f..3f7501836a9757f3d6fbf7349c2d7c921418b760 100644 (file)
@@ -27,6 +27,111 @@ using Gee;
 
 namespace Valadoc.ImporterHelper {
 
+       //
+       // resolve-parameter-ctype:
+       //
+
+       internal string? resolve_parameter_ctype (Api.Tree tree, Api.Node element, string parameter_name,
+               out string? param_name, out string? param_array_name, out bool is_return_type_len)
+       {
+               string[]? parts = split_type_name (parameter_name);
+               is_return_type_len = false;
+               param_array_name = null;
+
+               Api.FormalParameter? param = null; // type parameter or formal parameter
+               foreach (Api.Node node in element.get_children_by_type (Api.NodeType.FORMAL_PARAMETER, false)) {
+                       if (node.name == parts[0]) {
+                               param = node as Api.FormalParameter;
+                               break;
+                       }
+
+                       if (((Api.FormalParameter) node).implicit_array_length_cparameter_name == parts[0]) {
+                               param_array_name = ((Api.FormalParameter) node).name;
+                               break;
+                       }
+               }
+
+               if (element is Api.Callable
+                       && ((Api.Callable) element).implicit_array_length_cparameter_name == parts[0])
+               {
+                       is_return_type_len = true;
+               }
+
+               if (parts.length == 1) {
+                       param_name = parameter_name;
+                       return null;
+               }
+
+
+               Api.Item? inner = null;
+
+               if (param_array_name != null || is_return_type_len) {
+                       inner = tree.search_symbol_str (null, "int");
+               } else if (param != null) {
+                       inner = param.parameter_type;
+               }
+
+               while (inner != null) {
+                       if (inner is Api.TypeReference) {
+                               inner = ((Api.TypeReference) inner).data_type;
+                       } else if (inner is Api.Pointer) {
+                               inner = ((Api.Pointer) inner).data_type;
+                       } else if (inner is Api.Array) {
+                               inner = ((Api.Array) inner).data_type;
+                       } else {
+                               break ;
+                       }
+               }
+
+
+               if (inner == null) {
+                       param_name = parameter_name;
+                       return null;
+               }
+
+               string? cname = null;
+               if (inner is Api.ErrorDomain) {
+                       cname = ((Api.ErrorDomain) inner).get_cname ();
+               } else if (inner is Api.Struct) {
+                       cname = ((Api.Struct) inner).get_cname ();
+               } else if (inner is Api.Class) {
+                       cname = ((Api.Class) inner).get_cname ();
+               } else if (inner is Api.Enum) {
+                       cname = ((Api.Enum) inner).get_cname ();
+               } else {
+                       assert_not_reached ();
+               }
+
+               param_name = (owned) parts[0];
+               return "c::" + cname + parts[1] + parts[2];
+       }
+
+
+       private string[]? split_type_name (string id) {
+               unichar c;
+
+               for (unowned string pos = id; (c = pos.get_char ()) != '\0'; pos = pos.next_char ()) {
+                       switch (c) {
+                       case '-': // ->
+                               return {id.substring (0, (long) (((char*) pos) - ((char*) id))), "->", (string) (((char*) pos) + 2)};
+
+                       case ':': // : or ::
+                               string sep = (pos.next_char ().get_char () == ':')? "::" : ":";
+                               return {id.substring (0, (long) (((char*) pos) - ((char*) id))), sep, (string) (((char*) pos) + sep.length)};
+
+                       case '.':
+                               return {id.substring (0, (long) (((char*) pos) - ((char*) id))), ".", (string) (((char*) pos) + 1)};
+                       }
+               }
+
+               return {id};
+       }
+
+
+
+       //
+       // extract-short-desc:
+       //
 
        internal void extract_short_desc (Comment comment, ContentFactory factory) {
                if (comment.content.size == 0) {
@@ -99,8 +204,13 @@ namespace Valadoc.ImporterHelper {
        }
 
        private inline Run? split_run (Run run, ContentFactory factory) {
+               if (run.style != Run.Style.NONE) {
+                       return null;
+               }
+
                Run? sec = null;
 
+
                Iterator<Inline> iter = run.content.iterator ();
                for (bool has_next = iter.next (); has_next; has_next = iter.next ()) {
                        Inline item = iter.get ();