[gobject-introspection/wip/transformer] [testcodegen] Add out parameters, generate documentation
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gobject-introspection/wip/transformer] [testcodegen] Add out parameters, generate documentation
- Date: Fri, 30 Jul 2010 12:42:09 +0000 (UTC)
commit 942fb85a5ef25711463a10f79f45093ffc5ef45a
Author: Colin Walters <walters verbum org>
Date: Fri Jul 30 08:04:31 2010 -0400
[testcodegen] Add out parameters, generate documentation
giscanner/testcodegen.py | 95 +++++++++++++++++++++++++++++++++++++++------
tests/Makefile.am | 6 +-
2 files changed, 85 insertions(+), 16 deletions(-)
---
diff --git a/giscanner/testcodegen.py b/giscanner/testcodegen.py
index 6c13a98..c8e853c 100644
--- a/giscanner/testcodegen.py
+++ b/giscanner/testcodegen.py
@@ -51,39 +51,72 @@ class CCodeGenerator(object):
self._lnamespace = self.namespace.lower()
def _gen_symbol(self, name):
+ name = name.replace(' ', '_')
return '%s_%s' % (self._lnamespace, name)
def _typecontainer_to_ctype(self, param):
+ if (isinstance(param, Parameter) and
+ param.direction in (PARAM_DIRECTION_OUT,
+ PARAM_DIRECTION_INOUT)):
+ suffix = '*'
+ else:
+ suffix = ''
if (param.type.is_equiv((TYPE_STRING, TYPE_FILENAME)) and
param.transfer == PARAM_TRANSFER_NONE):
- return "const gchar*"
- return param.type.ctype
+ return "const gchar*" + suffix
+ return param.type.ctype + suffix
def _write_prelude(self, out, func):
out.write("""
%s
%s (""" % (self._typecontainer_to_ctype(func.retval), func.symbol))
l = len(func.parameters)
- for i,param in enumerate(func.parameters):
- ctype = self._typecontainer_to_ctype(param)
- self.out_h.write('%s %s' % (ctype, param.argname))
- if i < l - 1:
- out_h.write(", ")
+ if func.parameters:
+ for i,param in enumerate(func.parameters):
+ ctype = self._typecontainer_to_ctype(param)
+ out.write('%s %s' % (ctype, param.argname))
+ if i < l - 1:
+ out.write(", ")
+ else:
+ out.write('void')
out.write(")")
def _write_prototype(self, func):
self._write_prelude(self.out_h, func)
self.out_h.write(";\n\n")
+ def _write_annotation_transfer(self, transfer):
+ self.out_c.write("(transfer %s)" % (transfer, ))
+
+ def _write_docs(self, func):
+ self.out_c.write("/**\n * %s:\n" % (func.symbol, ))
+ for param in func.parameters:
+ self.out_c.write(" * @%s: " % (param.argname, ))
+ if param.direction in (PARAM_DIRECTION_OUT, PARAM_DIRECTION_INOUT):
+ if param.caller_allocates:
+ allocate_string = ' caller-allocates'
+ else:
+ allocate_string = ''
+ self.out_c.write("(%s%s) " % (param.direction, allocate_string))
+ self._write_annotation_transfer(param.transfer)
+ self.out_c.write(":\n")
+ self.out_c.write(' *\n')
+ self.out_c.write(' * Undocumented.\n')
+ self.out_c.write(' *\n')
+ self.out_c.write(' * Returns: ')
+ self._write_annotation_transfer(func.retval.transfer)
+ self.out_c.write('\n */')
+
@contextmanager
def _function(self, func):
self._write_prototype(func)
+ self._write_docs(func)
self._write_prelude(self.out_c, func)
self.out_c.write("\n{\n")
yield
self.out_c.write("}\n\n")
- def codegen(self):
+ def _codegen_start(self):
warning = '/* GENERATED BY testcodegen.py; DO NOT EDIT */\n\n'
self.out_h.write(warning)
nsupper = self.namespace.upper()
@@ -97,17 +130,53 @@ class CCodeGenerator(object):
self.out_c.write(warning)
self.out_c.write("""#include "%s"\n\n""" % (self.out_h_filename, ))
+ def _codegen_end(self):
+ self.out_h.write("""#endif\n""")
+
+ self.out_h.close()
+ self.out_c.close()
+
+ def codegen(self):
+ self._codegen_start()
+
# First pass, generate constant returns
+ prefix = 'const return '
for typeval in INTROSPECTABLE_BASIC:
name = uscore_from_type(typeval)
- sym = self._gen_symbol(typeval.target_fundamental)
+ sym = self._gen_symbol(prefix + typeval.target_fundamental)
func = Function(name, Return(typeval, transfer=PARAM_TRANSFER_NONE),
[], False, sym)
with self._function(func):
default = get_default_for_typeval(typeval)
self.out_c.write(" return %s;\n" % (default, ))
- self.out_h.write("""#endif\n""")
-
- self.out_h.close()
- self.out_c.close()
+ # Void return, one parameter
+ prefix = 'oneparam '
+ for typeval in INTROSPECTABLE_BASIC:
+ if typeval is TYPE_NONE:
+ continue
+ name = uscore_from_type(typeval)
+ sym = self._gen_symbol(prefix + typeval.target_fundamental)
+ func = Function(name, Return(TYPE_NONE, transfer=PARAM_TRANSFER_NONE),
+ [Parameter('arg0', typeval, transfer=PARAM_TRANSFER_NONE,
+ direction=PARAM_DIRECTION_IN)], False, sym)
+ with self._function(func):
+ self.out_c.write(" return;\n")
+
+ # Void return, one (out) parameter
+ prefix = 'one_outparam '
+ for typeval in INTROSPECTABLE_BASIC:
+ if typeval is TYPE_NONE:
+ continue
+ name = uscore_from_type(typeval)
+ sym = self._gen_symbol(prefix + typeval.target_fundamental)
+ func = Function(name, Return(TYPE_NONE, transfer=PARAM_TRANSFER_NONE),
+ [Parameter('arg0', typeval, transfer=PARAM_TRANSFER_NONE,
+ direction=PARAM_DIRECTION_OUT)], False, sym)
+ with self._function(func):
+ default = get_default_for_typeval(func.retval)
+ self.out_c.write(" *arg0 = %s;\n" % (default, ))
+ self.out_c.write(" return;\n")
+
+
+ self._codegen_end()
diff --git a/tests/Makefile.am b/tests/Makefile.am
index eba3fdf..4d09219 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -18,13 +18,13 @@ everything-stamp.h: Makefile
touch $@
everything.c: everything-stamp.h
- true
+ @true
everything.h: everything-stamp.h
- true
+ @true
Everything-1.0.gir: libeverything-1.0.la
- $(AM_V_GEN) $(top_builddir)/tools/g-ir-scanner --namespace=Everything --version=1.0 --library=libeverything-1.0.la everything.h everything.c --output=$@
+ $(AM_V_GEN) $(top_builddir)/tools/g-ir-scanner --warn-all --reparse-validate --namespace=Everything --version=1.0 --library=libeverything-1.0.la everything.h everything.c --output=$@
Everything-1.0.typelib: Everything-1.0.gir
$(AM_V_GEN) $(top_builddir)/tools/g-ir-compiler $< -o $@
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]