gobject-introspection r212 - in trunk: . giscanner tools



Author: johan
Date: Tue Apr 22 14:37:04 2008
New Revision: 212
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=212&view=rev

Log:
2008-04-22  Johan Dahlin  <jdahlin async com br>

    * giscanner/girwriter.py:
    * tools/g-ir-scanner:   
    Add an initial GIR writer and a --format option to g-ir-scanner



Added:
   trunk/giscanner/girwriter.py   (contents, props changed)
Modified:
   trunk/ChangeLog
   trunk/tools/g-ir-scanner

Added: trunk/giscanner/girwriter.py
==============================================================================
--- (empty file)
+++ trunk/giscanner/girwriter.py	Tue Apr 22 14:37:04 2008
@@ -0,0 +1,127 @@
+from __future__ import with_statement
+
+from .gobjecttreebuilder import (GLibBoxed, GLibEnum, GLibEnumMember,
+                                 GLibFlags, GLibObject, GLibInterface)
+from .treebuilder import Class, Enum, Function, Interface
+from .xmlwriter import XMLWriter
+
+
+class GIRWriter(XMLWriter):
+    def __init__(self, namespace, nodes):
+        super(GIRWriter, self).__init__()
+        self._write_api(namespace, nodes)
+
+    def _write_api(self, namespace, nodes):
+        attrs = [
+            ('version', '1.0'),
+            ('xmlns', 'http://www.gtk.org/introspection/core/1.0'),
+            ('xmlns:c', 'http://www.gtk.org/introspection/c/1.0'),
+            ('xmlns:glib', 'http://www.gtk.org/introspection/glib/1.0'),
+            ]
+        with self.tagcontext('repository', attrs):
+            self._write_namespace(namespace, nodes)
+
+    def _write_namespace(self, namespace, nodes):
+        with self.tagcontext('namespace', [('name', namespace)]):
+            for node in nodes:
+                self._write_node(node)
+
+    def _write_node(self, node):
+        if isinstance(node, Function):
+            self._write_function(node)
+        elif isinstance(node, Enum):
+            self._write_enum(node)
+        elif isinstance(node, (Class, Interface)):
+            self._write_class(node)
+        elif isinstance(node, GLibBoxed):
+            self._write_boxed(node)
+        else:
+            print 'WRITER: Unhandled node', node
+
+    def _write_function(self, func, tag_name='function'):
+        attrs = [('name', func.name),
+                 ('c:symbol', func.symbol)]
+        with self.tagcontext(tag_name, attrs):
+            self._write_return_type(func.retval)
+            self._write_parameters(func.parameters)
+
+    def _write_method(self, method):
+        self._write_function(method, tag_name='method')
+
+    def _write_constructor(self, method):
+        self._write_function(method, tag_name='constructor')
+
+    def _write_return_type(self, return_):
+        if not return_:
+            return
+        with self.tagcontext('return-values'):
+            with self.tagcontext('return-value'):
+                self.write_tag('type', [('name', return_.type)])
+
+    def _write_parameters(self, parameters):
+        if not parameters:
+            return
+        with self.tagcontext('parameters'):
+            for parameter in parameters:
+                self._write_parameter(parameter)
+
+    def _write_parameter(self, parameter):
+        attrs = [('name', parameter.name)]
+        with self.tagcontext('parameters', attrs):
+            self.write_tag('type', [('name', parameter.type)])
+
+    def _write_enum(self, enum):
+        attrs = [('name', enum.name)]
+        tag_name = 'enumeration'
+        if isinstance(enum, GLibEnum):
+            attrs.extend([('glib:type-name', enum.type_name),
+                          ('glib:get-type', enum.get_type)])
+            if isinstance(enum, GLibFlags):
+                tag_name = 'bitmask'
+
+        with self.tagcontext(tag_name, attrs):
+            for member in enum.members:
+                self._write_member(member)
+
+    def _write_member(self, member):
+        attrs = [('name', member.name),
+                 ('value', str(member.value))]
+        if isinstance(member, GLibEnumMember):
+            attrs.append(('glib:nick', member.nick))
+        self.write_tag('member', attrs)
+
+    def _write_class(self, node):
+        attrs = [('name', node.name)]
+        if isinstance(node, Class):
+            tag_name = 'class'
+            if node.parent is not None:
+                attrs.append(('parent', node.parent))
+        else:
+            tag_name = 'interface'
+        if isinstance(node, (GLibObject, GLibInterface)):
+            attrs.append(('glib:type-name', node.type_name))
+            attrs.append(('glib:get-type', node.get_type))
+        with self.tagcontext(tag_name, attrs):
+            if isinstance(node, Class):
+                for method in node.constructors:
+                    self._write_constructor(method)
+            for method in node.methods:
+                self._write_method(method)
+            for prop in node.properties:
+                self._write_property(prop)
+
+    def _write_boxed(self, boxed):
+        attrs = [('glib:name', boxed.name),
+                 ('glib:type-name', boxed.type_name),
+                 ('glib:get-type', boxed.get_type)]
+
+        with self.tagcontext('glib:boxed', attrs):
+            for method in boxed.constructors:
+                self._write_constructor(method)
+            for method in boxed.methods:
+                self._write_method(method)
+
+    def _write_property(self, prop):
+        attrs = [('name', prop.name),
+                 ('prop', prop.type)]
+        self.write_tag('property', attrs)

Modified: trunk/tools/g-ir-scanner
==============================================================================
--- trunk/tools/g-ir-scanner	(original)
+++ trunk/tools/g-ir-scanner	Tue Apr 22 14:37:04 2008
@@ -5,13 +5,16 @@
 
 sys.path.insert(0, '.')
 
-from giscanner.gidlwriter import GIDLWriter
 from giscanner.gobjecttreebuilder import GObjectTreeBuilder
 from giscanner.sourcescanner import SourceScanner
 from giscanner.treebuilder import TreeBuilder
 
 def main(args):
     parser = optparse.OptionParser('%prog [options] sources')
+    parser.add_option("", "--format",
+                      action="store", dest="format",
+                      default="gidl",
+                      help="format to use, one of gidl, gir")
     parser.add_option("-i", "--include",
                       action="append", dest="includes", default=[],
                       help="include types for other gidls")
@@ -78,7 +81,14 @@
         builder.register_include(include)
     builder.parse(TreeBuilder(ss).get_nodes())
 
-    writer = GIDLWriter(options.namespace, builder.get_nodes())
+    if options.format == 'gir':
+        from giscanner.girwriter import GIRWriter
+        writer = GIRWriter(options.namespace, builder.get_nodes())
+    elif options.format == 'gidl':
+        from giscanner.gidlwriter import GIDLWriter
+        writer = GIDLWriter(options.namespace, builder.get_nodes())
+    else:
+        raise SystemExit("Unknown format: %s" % (options.format,))
 
     data = writer.get_xml()
     if options.output:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]