[valadoc] libvaladoc: gir-reader: accept @<id>(::|:|->|.)(<gid>)
- From: Florian Brosch <flobrosch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [valadoc] libvaladoc: gir-reader: accept @<id>(::|:|->|.)(<gid>)
- Date: Fri, 27 Jan 2012 16:45:52 +0000 (UTC)
commit 208fc48688a926ffac9a7e47c7070976ad6a72de
Author: Florian Brosch <flo brosch gmail com>
Date: Mon Jan 9 01:15:30 2012 +0100
libvaladoc: gir-reader: accept @<id>(::|:|->|.)(<gid>)
.../documentation/gtkdoccommentparser.vala | 93 +++++++++++++++++++-
1 files changed, 91 insertions(+), 2 deletions(-)
---
diff --git a/src/libvaladoc/documentation/gtkdoccommentparser.vala b/src/libvaladoc/documentation/gtkdoccommentparser.vala
index e1aa9f0..ec1ced6 100644
--- a/src/libvaladoc/documentation/gtkdoccommentparser.vala
+++ b/src/libvaladoc/documentation/gtkdoccommentparser.vala
@@ -215,7 +215,11 @@ public class Valadoc.Gtkdoc.Parser : Object, ResourceLocator {
this.tree = tree;
}
+ private Api.Node? element;
+
public Comment? parse (Api.Node element, Api.GirSourceComment gir_comment) {
+ this.element = element;
+
Comment? comment = this.parse_main_content (gir_comment);
if (comment == null) {
return null;
@@ -1082,6 +1086,77 @@ 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 null;
+ }
+
+ private string? resolve_parameter_ctype (string parameter_name, out string? param_name) {
+ string[]? parts = split_type_name (current.content);
+ param_name = null;
+ if (parts == null) {
+ return 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;
+ }
+ }
+
+
+ Api.Item? 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) {
+ 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);
@@ -1148,9 +1223,23 @@ public class Valadoc.Gtkdoc.Parser : Object, ResourceLocator {
run.content.add (this.create_type_link (current.content));
next ();
} else if (current.type == TokenType.GTKDOC_PARAM) {
+ string? param_name;
+ string? cname = resolve_parameter_ctype (current.content, out param_name);
Run current_run = factory.create_run (Run.Style.MONOSPACED);
- current_run.content.add (factory.create_text (current.content));
- run.content.add (current_run);
+
+ if (cname == null) {
+ current_run.content.add (factory.create_text (current.content));
+ run.content.add (current_run);
+ } else {
+ current_run.content.add (factory.create_text (param_name));
+ run.content.add (current_run);
+
+ run.content.add (factory.create_text ("."));
+
+ Taglets.Link link = factory.create_taglet ("link") as Taglets.Link;
+ link.symbol_name = cname;
+ run.content.add (link);
+ }
next ();
} else if (current.type == TokenType.GTKDOC_SIGNAL) {
run.content.add (this.create_type_link ("::"+current.content));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]