[gobject-introspection/wip/transformer] [testcodegen] Add out parameters, generate documentation



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]