summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2013-01-31 23:40:20 -0500
committerJasper St. Pierre <jstpierre@mecheye.net>2013-02-01 19:47:42 -0500
commit7169562133632e11fb4f564211a1db1aa61bab5c (patch)
tree5046869e9d49e1178a18897a10feb8859833814c
parent3209fdf04bdff42033e1f833913c394adcaa2e67 (diff)
downloadgobject-introspection-7169562133632e11fb4f564211a1db1aa61bab5c.tar.gz
doctool: Initial import of a Gjs language that we support
Copy/pasted from Python.
-rw-r--r--Makefile-giscanner.am13
-rw-r--r--giscanner/doctemplates/Gjs/class.tmpl17
-rw-r--r--giscanner/doctemplates/Gjs/constructor.tmpl1
-rw-r--r--giscanner/doctemplates/Gjs/default.tmpl1
-rw-r--r--giscanner/doctemplates/Gjs/enum.tmpl11
-rw-r--r--giscanner/doctemplates/Gjs/function.tmpl54
-rw-r--r--giscanner/doctemplates/Gjs/method.tmpl1
-rw-r--r--giscanner/doctemplates/Gjs/namespace.tmpl2
-rw-r--r--giscanner/doctemplates/Gjs/property.tmpl10
-rw-r--r--giscanner/doctemplates/Gjs/record.tmpl2
-rw-r--r--giscanner/doctemplates/Gjs/signal.tmpl35
-rw-r--r--giscanner/doctemplates/Gjs/vfunc.tmpl23
-rw-r--r--giscanner/mallardwriter.py71
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Callback.page25
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Enum.page31
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-property-example.page30
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-signal-example.page44
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-vfunc.page35
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.method.page77
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.new.page40
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.page63
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.static_method.page48
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.array_function.page48
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.callback_function.page61
-rw-r--r--tests/doctool/DocExamples-1.0-Gjs-expected/index.page33
-rw-r--r--tests/doctool/Makefile.am13
26 files changed, 786 insertions, 3 deletions
diff --git a/Makefile-giscanner.am b/Makefile-giscanner.am
index d5402f6d..728ff10d 100644
--- a/Makefile-giscanner.am
+++ b/Makefile-giscanner.am
@@ -78,7 +78,18 @@ nobase_template_DATA = \
giscanner/doctemplates/Python/property.tmpl \
giscanner/doctemplates/Python/record.tmpl \
giscanner/doctemplates/Python/signal.tmpl \
- giscanner/doctemplates/Python/vfunc.tmpl
+ giscanner/doctemplates/Python/vfunc.tmpl \
+ giscanner/doctemplates/Gjs/class.tmpl \
+ giscanner/doctemplates/Gjs/constructor.tmpl \
+ giscanner/doctemplates/Gjs/default.tmpl \
+ giscanner/doctemplates/Gjs/enum.tmpl \
+ giscanner/doctemplates/Gjs/function.tmpl \
+ giscanner/doctemplates/Gjs/method.tmpl \
+ giscanner/doctemplates/Gjs/namespace.tmpl \
+ giscanner/doctemplates/Gjs/property.tmpl \
+ giscanner/doctemplates/Gjs/record.tmpl \
+ giscanner/doctemplates/Gjs/signal.tmpl \
+ giscanner/doctemplates/Gjs/vfunc.tmpl
_giscanner_la_CFLAGS = \
$(PYTHON_INCLUDES) \
diff --git a/giscanner/doctemplates/Gjs/class.tmpl b/giscanner/doctemplates/Gjs/class.tmpl
new file mode 100644
index 00000000..3991ff31
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/class.tmpl
@@ -0,0 +1,17 @@
+<%inherit file="/class.tmpl"/>
+<%block name="synopsis">
+ <synopsis><code>
+from gi.repository import ${namespace.name}
+
+${formatter.to_underscores(node.name).lower()} = ${namespace.name}.${node.name}(\
+% for property_, ix in zip(node.properties, range(len(node.properties))):
+% if property_.construct or property_.construct_only or property_.writable:
+<link xref='${namespace.name}.${node.name}-${property_.name}'>${property_.name.replace('-', '_')}</link>=value\
+% if ix != len(node.properties) - 1:
+, \
+% endif
+% endif
+% endfor
+)\
+ </code></synopsis>
+</%block>
diff --git a/giscanner/doctemplates/Gjs/constructor.tmpl b/giscanner/doctemplates/Gjs/constructor.tmpl
new file mode 100644
index 00000000..a03d2825
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/constructor.tmpl
@@ -0,0 +1 @@
+<%inherit file="./function.tmpl"/>
diff --git a/giscanner/doctemplates/Gjs/default.tmpl b/giscanner/doctemplates/Gjs/default.tmpl
new file mode 100644
index 00000000..b66ae926
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/default.tmpl
@@ -0,0 +1 @@
+<%inherit file="/base.tmpl"/>
diff --git a/giscanner/doctemplates/Gjs/enum.tmpl b/giscanner/doctemplates/Gjs/enum.tmpl
new file mode 100644
index 00000000..840f79f5
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/enum.tmpl
@@ -0,0 +1,11 @@
+<%inherit file="/base.tmpl"/>
+<%block name="details">
+% if node.members:
+<dl>
+% for member, ix in zip(node.members, range(len(node.members))):
+<dt><p>${node.name}.${member.name.upper()} :</p></dt>
+<dd>${formatter.format(node, member.doc)}</dd>
+% endfor
+</dl>
+% endif
+</%block>
diff --git a/giscanner/doctemplates/Gjs/function.tmpl b/giscanner/doctemplates/Gjs/function.tmpl
new file mode 100644
index 00000000..92bfb3a9
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/function.tmpl
@@ -0,0 +1,54 @@
+<%inherit file="/base.tmpl"/>
+<%block name="info">
+% if node.parent is not None:
+ <link type="guide" xref="${namespace.name}.${node.parent.name}" group="${page_style}"/>
+% else:
+ <link type="guide" xref="index" group="${page_style}"/>
+% endif
+ <api:function>
+ <api:returns>
+ <api:type>${formatter.format_type(node.retval.type) | x}</api:type>
+ </api:returns>
+ <api:name>${node.symbol}</api:name>
+% if node.is_method:
+ <api:arg>
+ <api:type>${node.parent.ctype} *</api:type>
+ <api:name>self</api:name>
+ </api:arg>
+% endif
+% for arg in node.parameters:
+% if arg.type.ctype == '<varargs>':
+ <api:varargs/>
+% else:
+ <api:arg>
+ <api:type>${formatter.format_type(arg.type) | x}</api:type>
+ <api:name>${arg.argname}</api:name>
+ </api:arg>
+% endif
+% endfor
+ </api:function>
+</%block>
+<%block name="synopsis">
+<synopsis><code mime="text/x-gjs">
+function \
+${node.name}(\
+${', '.join('%s:%s' % (arg.argname, formatter.format_type(arg.type)) for arg in node.parameters)}\
+):${formatter.format_type(node.retval.type)} {
+ // Gjs wrapper for ${node.symbol}()
+}
+</code></synopsis>
+</%block>
+<%block name="details">
+% if node.parameters or node.retval:
+<dl>
+% for arg, ix in zip(node.parameters, range(len(node.parameters))):
+<dt><p>${arg.argname} :</p></dt>
+<dd>${formatter.format(node, arg.doc)}</dd>
+% endfor
+% if node.retval and node.retval.type.ctype != 'void':
+<dt><p>Returns :</p></dt>
+<dd>${formatter.format(node, node.retval.doc)}</dd>
+% endif
+</dl>
+% endif
+</%block>
diff --git a/giscanner/doctemplates/Gjs/method.tmpl b/giscanner/doctemplates/Gjs/method.tmpl
new file mode 100644
index 00000000..a03d2825
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/method.tmpl
@@ -0,0 +1 @@
+<%inherit file="./function.tmpl"/>
diff --git a/giscanner/doctemplates/Gjs/namespace.tmpl b/giscanner/doctemplates/Gjs/namespace.tmpl
new file mode 100644
index 00000000..4d80c2a5
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/namespace.tmpl
@@ -0,0 +1,2 @@
+<%! page_type="guide" %>\
+<%inherit file="/namespace.tmpl"/>
diff --git a/giscanner/doctemplates/Gjs/property.tmpl b/giscanner/doctemplates/Gjs/property.tmpl
new file mode 100644
index 00000000..f05bc820
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/property.tmpl
@@ -0,0 +1,10 @@
+<%inherit file="/base.tmpl"/>
+<%block name="info">
+ <link type="guide" xref="${namespace.name}.${node.parent.name}" group="property"/>
+ <title type="link" role="topic">${node.name}</title>
+</%block>
+<%block name="synopsis">
+<synopsis><code mime="text/x-python">
+"${node.name}" ${formatter.format_type(node.type)} : ${formatter.format_property_flags(node)}
+</code></synopsis>
+</%block>
diff --git a/giscanner/doctemplates/Gjs/record.tmpl b/giscanner/doctemplates/Gjs/record.tmpl
new file mode 100644
index 00000000..1523e0df
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/record.tmpl
@@ -0,0 +1,2 @@
+<%! page_type="guide" %>\
+<%inherit file="/base.tmpl"/>
diff --git a/giscanner/doctemplates/Gjs/signal.tmpl b/giscanner/doctemplates/Gjs/signal.tmpl
new file mode 100644
index 00000000..f2eb5868
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/signal.tmpl
@@ -0,0 +1,35 @@
+<%inherit file="/base.tmpl"/>
+<%block name="info">
+ <link type="guide" xref="${namespace.name}.${node.parent.name}" group="signal"/>
+ <title type="link" role="topic">${node.name}</title>
+</%block>
+<%block name="synopsis">
+<synopsis><code mime="text/x-python">
+function callback(${formatter.to_underscores(node.parent.name).lower()}, \
+% for arg in node.parameters:
+${arg.argname}:${formatter.format_type(arg.type)}, \
+% endfor
+user_param1, ...):${formatter.format_type(node.retval.type)};
+</code></synopsis>
+</%block>
+<%block name="details">
+<dl>
+<dt><p>${formatter.to_underscores(node.parent.name).lower()} :</p></dt>
+<dd><p>instance of ${namespace.name}.${node.parent.name} that is emitting the signal</p></dd>
+% for arg in node.parameters:
+<dt><p>${arg.argname} :</p></dt>
+<dd>${formatter.format(node, arg.doc)}</dd>
+% endfor
+<dt><p>user_param1 :</p></dt>
+<dd><p>first user parameter (if any) specified with the connect() method</p></dd>
+<dt><p>... :</p></dt>
+<dd><p>additional user parameters (if any)</p></dd>
+% if node.retval and \
+ node.retval.type.ctype != 'void' and \
+ node.retval.type.ctype is not None:
+<dt><p>Returns :</p></dt>
+<dd>${node.retval.type.ctype} ${formatter.format(node, node.retval.doc)}</dd>
+% endif
+</dl>
+</%block>
+
diff --git a/giscanner/doctemplates/Gjs/vfunc.tmpl b/giscanner/doctemplates/Gjs/vfunc.tmpl
new file mode 100644
index 00000000..bba3f38d
--- /dev/null
+++ b/giscanner/doctemplates/Gjs/vfunc.tmpl
@@ -0,0 +1,23 @@
+<%inherit file="/base.tmpl"/>
+<%block name="synopsis">
+<synopsis><code mime="text/x-gjs">
+function vfunc_${node.name}(\
+${', '.join('%s:%s' % (arg.argname, formatter.format_type(arg.type)) for arg in node.parameters)}\
+):${formatter.format_type(node.retval.type)} {
+}
+</code></synopsis>
+</%block>
+<%block name="details">
+% if node.parameters or node.retval:
+<dl>
+% for arg, ix in zip(node.parameters, range(len(node.parameters))):
+<dt><p>${arg.argname} :</p></dt>
+<dd>${formatter.format(node, arg.doc)}</dd>
+% endfor
+% if node.retval and node.retval.type.ctype != 'void':
+<dt><p>Returns :</p></dt>
+<dd>${formatter.format(node, node.retval.doc)}</dd>
+% endif
+</dl>
+% endif
+</%block>
diff --git a/giscanner/mallardwriter.py b/giscanner/mallardwriter.py
index 08d52c84..ece54a9b 100644
--- a/giscanner/mallardwriter.py
+++ b/giscanner/mallardwriter.py
@@ -450,9 +450,80 @@ class MallardFormatterPython(MallardFormatter):
else:
return func.name
+class MallardFormatterGjs(MallardFormatter):
+ language = "Gjs"
+ mime_type = "text/x-gjs"
+
+ fundamentals = {
+ "TRUE": "true",
+ "FALSE": "false",
+ "NULL": "null",
+ }
+
+ def should_render_node(self, node):
+ if isinstance(node, ast.Record) and node.is_gtype_struct_for is not None:
+ return False
+
+ return True
+
+ def is_method(self, node):
+ if getattr(node, "is_method", False):
+ return True
+
+ if isinstance(node, (ast.VFunction)):
+ return True
+
+ return False
+
+ def format_fundamental_type(self, name):
+ fundamental_types = {
+ "utf8": "String",
+ "gunichar": "String",
+ "gchar": "String",
+ "guchar": "String",
+ "gboolean": "Boolean",
+ "gint": "Number",
+ "guint": "Number",
+ "glong": "Number",
+ "gulong": "Number",
+ "gint64": "Number",
+ "guint64": "Number",
+ "gfloat": "Number",
+ "gdouble": "Number",
+ "gchararray": "String",
+ "GParam": "GLib.Param",
+ "PyObject": "Object",
+ "GStrv": "[String]",
+ "GVariant": "GLib.Variant",
+ }
+
+ return fundamental_types.get(name, name)
+
+ def format_type(self, type_):
+ if isinstance(type_, ast.Array):
+ return '[' + self.format_type(type_.element_type) + ']'
+ elif isinstance(type_, ast.Map):
+ return '{%s: %s}' % (self.format_type(type_.key_type),
+ self.format_type(type_.value_type))
+ elif type_.target_fundamental == "none":
+ return "void"
+ elif type_.target_giname is not None:
+ return type_.target_giname
+ else:
+ return self.format_fundamental_type(type_.target_fundamental)
+
+ def format_function_name(self, func):
+ if func.is_method:
+ return "%s.prototype.%s" % (func.parent.name, func.name)
+ elif func.is_constructor:
+ return "%s.%s" % (func.parent.name, func.name)
+ else:
+ return func.name
+
LANGUAGES = {
"c": MallardFormatterC,
"python": MallardFormatterPython,
+ "gjs": MallardFormatterGjs,
}
class MallardWriter(object):
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Callback.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Callback.page
new file mode 100644
index 00000000..98d30f8c
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Callback.page
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<page id="DocExamples.Callback"
+ type="topic"
+ style="default"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="index"/>
+
+ </info>
+ <title>DocExamples.Callback</title>
+
+
+
+
+
+
+
+
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Enum.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Enum.page
new file mode 100644
index 00000000..79ea6370
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Enum.page
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<page id="DocExamples.Enum"
+ type="topic"
+ style="enum"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="index"/>
+
+ </info>
+ <title>DocExamples.Enum</title>
+
+
+
+ <p>This is an example to document an enumeration.</p>
+
+
+
+
+<dl>
+<dt><p>Enum.FOO :</p></dt>
+<dd><p>a foo</p></dd>
+<dt><p>Enum.BAR :</p></dt>
+<dd><p>a bar</p></dd>
+</dl>
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-property-example.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-property-example.page
new file mode 100644
index 00000000..398fc4cc
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-property-example.page
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<page id="DocExamples.Obj-property-example"
+ type="topic"
+ style="property"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="DocExamples.Obj" group="property"/>
+ <title type="link" role="topic">property-example</title>
+
+ </info>
+ <title>DocExamples.Obj:property-example</title>
+
+<synopsis><code mime="text/x-python">
+"property-example" {String: gint8} : Read / Write
+</code></synopsis>
+
+
+ <p>This is an example of how to document a property.</p>
+
+
+ <p>Since 0.99</p>
+
+
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-signal-example.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-signal-example.page
new file mode 100644
index 00000000..8b7e5d5d
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-signal-example.page
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<page id="DocExamples.Obj-signal-example"
+ type="topic"
+ style="signal"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="DocExamples.Obj" group="signal"/>
+ <title type="link" role="topic">signal-example</title>
+
+ </info>
+ <title>DocExamples.Obj::signal-example</title>
+
+<synopsis><code mime="text/x-python">
+def callback(obj, int_param, float_param, pointer_param, user_param1, ...)
+</code></synopsis>
+
+
+ <p>This is an example of how to document a signal.</p>
+
+
+ <p>Since 0.99</p>
+
+
+<dl>
+<dt><p>obj :</p></dt>
+<dd><p>instance of DocExamples.Obj that is emitting the signal</p></dd>
+<dt><p>int_param :</p></dt>
+<dd><p>a parameter of type int</p></dd>
+<dt><p>float_param :</p></dt>
+<dd><p>a parameter of type float</p></dd>
+<dt><p>pointer_param :</p></dt>
+<dd><p>A pointer to @obj's thingy -- pass <code>int_param</code> if you really want to.</p></dd>
+<dt><p>user_param1 :</p></dt>
+<dd><p>first user parameter (if any) specified with the connect() method</p></dd>
+<dt><p>... :</p></dt>
+<dd><p>additional user parameters (if any)</p></dd>
+</dl>
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-vfunc.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-vfunc.page
new file mode 100644
index 00000000..bd876ca8
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj-vfunc.page
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<page id="DocExamples.Obj-vfunc"
+ type="topic"
+ style="vfunc"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="index"/>
+
+ </info>
+ <title>DocExamples.Obj::vfunc</title>
+
+<synopsis><code mime="text/x-python">
+@accepts(Number)
+@returns(none)
+def do_vfunc(self, first_arg):
+</code></synopsis>
+
+
+ <p>This is an example of how to document a vfunc.</p>
+
+
+ <p>Since 0.99</p>
+
+
+<dl>
+<dt><p>first_arg :</p></dt>
+<dd><p>first argument</p></dd>
+</dl>
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.method.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.method.page
new file mode 100644
index 00000000..4e049123
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.method.page
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<page id="DocExamples.Obj.method"
+ type="topic"
+ style="method"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="DocExamples.Obj" group="method"/>
+ <api:function>
+ <api:returns>
+ <api:type>Boolean</api:type>
+ </api:returns>
+ <api:name>doc_examples_obj_method</api:name>
+ <api:arg>
+ <api:type>DocExamplesObj *</api:type>
+ <api:name>self</api:name>
+ </api:arg>
+ <api:arg>
+ <api:type>Number</api:type>
+ <api:name>first_arg</api:name>
+ </api:arg>
+ <api:arg>
+ <api:type>Number</api:type>
+ <api:name>second_arg</api:name>
+ </api:arg>
+ <api:arg>
+ <api:type>Boolean</api:type>
+ <api:name>boolean_arg</api:name>
+ </api:arg>
+ <api:arg>
+ <api:type>gpointer</api:type>
+ <api:name>pointer_arg</api:name>
+ </api:arg>
+ <api:arg>
+ <api:type>String</api:type>
+ <api:name>string</api:name>
+ </api:arg>
+ </api:function>
+
+ </info>
+ <title>Obj.prototype.method</title>
+
+<synopsis><code mime="text/x-python">
+@accepts(Number, Number, Boolean, gpointer, String)
+@returns(Boolean)
+def method(self, first_arg, second_arg, boolean_arg, pointer_arg, string):
+ # Python wrapper for doc_examples_obj_method()
+</code></synopsis>
+
+
+ <p>This is an example of how to document a method.</p><p>You should call this on a <link xref="DocExamples.Obj"/> that was
+created with <link xref="DocExamples.Obj.new"/>.</p><p>This should be a %FALSEALARM.</p>
+
+
+ <p>Since 0.99</p>
+
+
+<dl>
+<dt><p>first_arg :</p></dt>
+<dd><p>A <link xref="DocExamples.Obj"/>.</p></dd>
+<dt><p>second_arg :</p></dt>
+<dd><p>second argument</p></dd>
+<dt><p>boolean_arg :</p></dt>
+<dd><p>You should always pass <code>true</code>.</p></dd>
+<dt><p>pointer_arg :</p></dt>
+<dd><p>If not <code>null</code>, do a thing. Pass <code>first_arg</code> if you want to sometimes. You can also pass <code>second_arg</code>, or even <code>boolean_arg</code>.</p></dd>
+<dt><p>string :</p></dt>
+<dd><p>A NUL-terminated string.</p></dd>
+<dt><p>Returns :</p></dt>
+<dd><p>Either <code>false</code> or something <code>false</code>-y.</p></dd>
+</dl>
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.new.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.new.page
new file mode 100644
index 00000000..16dbd65a
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.new.page
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<page id="DocExamples.Obj.new"
+ type="topic"
+ style="constructor"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="DocExamples.Obj" group="constructor"/>
+ <api:function>
+ <api:returns>
+ <api:type>DocExamples.Obj</api:type>
+ </api:returns>
+ <api:name>doc_examples_obj_new</api:name>
+ </api:function>
+
+ </info>
+ <title>Obj.new</title>
+
+<synopsis><code mime="text/x-python">
+@returns(DocExamples.Obj)
+def new():
+ # Python wrapper for doc_examples_obj_new()
+</code></synopsis>
+
+
+
+
+
+
+
+<dl>
+<dt><p>Returns :</p></dt>
+<dd></dd>
+</dl>
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.page
new file mode 100644
index 00000000..c040d0e3
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.page
@@ -0,0 +1,63 @@
+<?xml version="1.0"?>
+<page id="DocExamples.Obj"
+ type="guide"
+ style="class"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="index"/>
+
+ </info>
+ <title>DocExamples.Obj</title>
+
+ <synopsis><code>
+from gi.repository import DocExamples
+
+obj = DocExamples.Obj(<link xref='DocExamples.Obj-property-example'>property_example</link>=value) </code></synopsis>
+
+
+ <p>This is an example of how to document a class</p><p>This class has a signal: <link xref="DocExamples.Obj-signal-example"/>.</p><p>And also has a property: <link xref="DocExamples.Obj-property-example"/>.</p>
+
+
+ <p>Since 0.99</p>
+
+
+ <synopsis>
+ <title>Hierarchy</title>
+ <tree>
+ <item>
+ <code>GObject.Object</code>
+ <item>
+ <code>DocExamples.Obj</code>
+ </item>
+ </item>
+ </tree>
+ </synopsis>
+
+
+ <links type="topic" ui:expanded="yes"
+ api:type="function" api:mime="text/x-gjs"
+ groups="method" style="linklist">
+ <title>Methods</title>
+ </links>
+ <links type="topic" ui:expanded="yes"
+ api:type="function" api:mime="text/x-gjs"
+ groups="function" style="linklist">
+ <title>Functions</title>
+ </links>
+ <links type="topic" ui:expanded="yes" groups="property" style="linklist">
+ <title>Properties</title>
+ </links>
+ <links type="topic" ui:expanded="yes" groups="signal" style="linklist">
+ <title>Signals</title>
+ </links>
+ <links type="topic" ui:expanded="yes" groups="vfunc" style="linklist">
+ <title>Virtual functions</title>
+ </links>
+ <links type="topic" ui:expanded="yes" groups="#first #default #last" style="linklist">
+ <title>Other</title>
+ </links>
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.static_method.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.static_method.page
new file mode 100644
index 00000000..6577e9b5
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.Obj.static_method.page
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<page id="DocExamples.Obj.static_method"
+ type="topic"
+ style="function"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="DocExamples.Obj" group="function"/>
+ <api:function>
+ <api:returns>
+ <api:type>Boolean</api:type>
+ </api:returns>
+ <api:name>doc_examples_obj_static_method</api:name>
+ <api:arg>
+ <api:type>Number</api:type>
+ <api:name>out_arg</api:name>
+ </api:arg>
+ </api:function>
+
+ </info>
+ <title>static_method</title>
+
+<synopsis><code mime="text/x-python">
+@accepts(Number)
+@returns(Boolean)
+def static_method(out_arg):
+ # Python wrapper for doc_examples_obj_static_method()
+</code></synopsis>
+
+
+ <p>This is an example of a function with an out argument
+and a return value.</p>
+
+
+
+
+<dl>
+<dt><p>out_arg :</p></dt>
+<dd><p>a pointer to int, or <code>null</code> to ignore</p></dd>
+<dt><p>Returns :</p></dt>
+<dd><p><code>true</code> if <code>out_arg</code> is valid, <code>false</code> otherwise</p></dd>
+</dl>
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.array_function.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.array_function.page
new file mode 100644
index 00000000..f41047b2
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.array_function.page
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<page id="DocExamples.array_function"
+ type="topic"
+ style="function"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="index" group="function"/>
+ <api:function>
+ <api:returns>
+ <api:type>[Number]</api:type>
+ </api:returns>
+ <api:name>doc_examples_array_function</api:name>
+ <api:arg>
+ <api:type>Number</api:type>
+ <api:name>out_len</api:name>
+ </api:arg>
+ </api:function>
+
+ </info>
+ <title>array_function</title>
+
+<synopsis><code mime="text/x-python">
+@accepts(Number)
+@returns([Number])
+def array_function(out_len):
+ # Python wrapper for doc_examples_array_function()
+</code></synopsis>
+
+
+ <p>This function returns an array with an explicit length,
+and the length should be invisible in most introspected bindings.</p>
+
+
+
+
+<dl>
+<dt><p>out_len :</p></dt>
+<dd><p>the length of the returned array</p></dd>
+<dt><p>Returns :</p></dt>
+<dd><p>an array of numbers.</p></dd>
+</dl>
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.callback_function.page b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.callback_function.page
new file mode 100644
index 00000000..9b805712
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/DocExamples.callback_function.page
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<page id="DocExamples.callback_function"
+ type="topic"
+ style="function"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="index" group="function"/>
+ <api:function>
+ <api:returns>
+ <api:type>DocExamples.Enum</api:type>
+ </api:returns>
+ <api:name>doc_examples_callback_function</api:name>
+ <api:arg>
+ <api:type>DocExamples.Callback</api:type>
+ <api:name>callback</api:name>
+ </api:arg>
+ <api:arg>
+ <api:type>gpointer</api:type>
+ <api:name>user_data</api:name>
+ </api:arg>
+ <api:arg>
+ <api:type>GLib.DestroyNotify</api:type>
+ <api:name>destroy_notify</api:name>
+ </api:arg>
+ </api:function>
+
+ </info>
+ <title>callback_function</title>
+
+<synopsis><code mime="text/x-python">
+@accepts(DocExamples.Callback, gpointer, GLib.DestroyNotify)
+@returns(DocExamples.Enum)
+def callback_function(callback, user_data, destroy_notify):
+ # Python wrapper for doc_examples_callback_function()
+</code></synopsis>
+
+
+ <p>This is a function that takes a callback. Different languages
+will expose this in different ways (e.g. Python keeps the
+<code>user_data</code> parameter, while JS doesn't)</p>
+
+
+
+
+<dl>
+<dt><p>callback :</p></dt>
+<dd><p>Just Call Me Maybe</p></dd>
+<dt><p>user_data :</p></dt>
+<dd><p>your stuff</p></dd>
+<dt><p>destroy_notify :</p></dt>
+<dd><p>how to get rid of <code>user_data</code></p></dd>
+<dt><p>Returns :</p></dt>
+<dd><p><link xref="DocExamples.Enum"/>.foo sometimes, <link xref="DocExamples.Enum"/>.bar other times.</p></dd>
+</dl>
+
+
+
+</page>
diff --git a/tests/doctool/DocExamples-1.0-Gjs-expected/index.page b/tests/doctool/DocExamples-1.0-Gjs-expected/index.page
new file mode 100644
index 00000000..de98563c
--- /dev/null
+++ b/tests/doctool/DocExamples-1.0-Gjs-expected/index.page
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<page id="index"
+ type="guide"
+ style="namespace"
+ xmlns="http://projectmallard.org/1.0/"
+ xmlns:api="http://projectmallard.org/experimental/api/"
+ xmlns:ui="http://projectmallard.org/experimental/ui/">
+ <info>
+
+ <link type="guide" xref="index"/>
+
+ </info>
+ <title>Index</title>
+
+
+
+
+
+
+
+
+
+ <links type="topic" ui:expanded="yes" groups="class" style="linklist">
+ <title>Classes</title>
+ </links>
+ <links type="topic" ui:expanded="yes" groups="function" style="linklist">
+ <title>Functions</title>
+ </links>
+ <links type="topic" ui:expanded="yes" groups="#first #default #last" style="linklist">
+ <title>Other</title>
+ </links>
+
+</page>
diff --git a/tests/doctool/Makefile.am b/tests/doctool/Makefile.am
index 127b2585..4d2b9d7f 100644
--- a/tests/doctool/Makefile.am
+++ b/tests/doctool/Makefile.am
@@ -14,8 +14,8 @@ libdocexamples_la_SOURCES = $(srcdir)/doc-examples-obj.c $(srcdir)/doc-examples-
GIRS =
TYPELIBS = $(GIRS:.gir=.typelib)
INTROSPECTION_GIRS = $(GIRS)
-CHECK_TARGETS = $(GIRS:.gir=-C.page.check) $(GIRS:.gir=-Python.page.check)
-MALLARD_DIRS = $(GIRS:.gir=-C) $(GIRS:.gir=-Python)
+CHECK_TARGETS = $(GIRS:.gir=-C.page.check) $(GIRS:.gir=-Python.page.check) $(GIRS:.gir=-Gjs.page.check)
+MALLARD_DIRS = $(GIRS:.gir=-C) $(GIRS:.gir=-Python) $(GIRS:.gir=-Gjs)
EXPECTED_MALLARD_DIRS = $(MALLARD_DIRS:=-expected)
CLEANFILES = $(TYPELIBS) $(GIRS)
BUILT_SOURCES = $(MALLARD_DIRS)
@@ -40,12 +40,21 @@ GIRS += DocExamples-1.0.gir
$(AM_V_at)rm -f $*-Python/*.page
$(AM_V_at)$(INTROSPECTION_DOCTOOL) --language Python $*.gir -o $*-Python/
+%-Gjs: %.gir
+ $(AM_V_GEN)
+ $(AM_V_at)$(MKDIR_P) $*-Gjs
+ $(AM_V_at)rm -f $*-Gjs/*.page
+ $(AM_V_at)$(INTROSPECTION_DOCTOOL) --language Gjs $*.gir -o $*-Gjs/
+
%-C.page.check: %-C
@diff -u -w -B -U 10 $(srcdir)/$*-C-expected $*-C && echo " TEST $*-C"
%-Python.page.check: %-Python
@diff -u -w -B -U 10 $(srcdir)/$*-Python-expected $*-Python && echo " TEST $*-Python"
+%-Gjs.page.check: %-Gjs
+ @diff -u -w -B -U 10 $(srcdir)/$*-Gjs-expected $*-Gjs && echo " TEST $*-Gjs"
+
check-local: $(CHECK_TARGETS) $(TYPELIBS)
clean-local:
@rm -rf $(MALLARD_DIRS)