gobject-introspection r467 - in trunk: . gir girepository giscanner tests/scanner tools



Author: walters
Date: Sat Aug 23 16:11:01 2008
New Revision: 467
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=467&view=rev

Log:
2008-08-22  Colin Walters  <walters verbum org>

	* girepository/girparser.c: Ignore <include>.
	* giscanner/girparser.py: Parse them.
	* giscanner/girwriter.py: Generate them.
	* giscanner/transformer.py: Process <include>
	recursively.  Don't require full path for
	includes, look in {$XDG_DATA_DIRS}/gir.
	* tools/g-ir-scanner: Pass through includes.
	* Makefile.am: Remove extra --include
	args for scanner.
	* *-expected.gir: Add expected includes.


Modified:
   trunk/ChangeLog
   trunk/gir/Makefile.am
   trunk/girepository/girparser.c
   trunk/giscanner/girparser.py
   trunk/giscanner/girwriter.py
   trunk/giscanner/transformer.py
   trunk/tests/scanner/Makefile.am
   trunk/tests/scanner/annotation-expected.gir
   trunk/tests/scanner/drawable-expected.gir
   trunk/tests/scanner/foo-expected.gir
   trunk/tests/scanner/utility-expected.gir
   trunk/tools/g-ir-scanner

Modified: trunk/gir/Makefile.am
==============================================================================
--- trunk/gir/Makefile.am	(original)
+++ trunk/gir/Makefile.am	Sat Aug 23 16:11:01 2008
@@ -50,7 +50,6 @@
 	    --noclosure \
 	    --output $@ \
 	    --strip-prefix=g \
-            --include=$(top_builddir)/gir/GLib.gir \
             --include=$(top_builddir)/gir/GObject.gir \
 	    --library=gio-2.0 \
 	    -I$(GIO_INCLUDEDIR) \

Modified: trunk/girepository/girparser.c
==============================================================================
--- trunk/girepository/girparser.c	(original)
+++ trunk/girepository/girparser.c	Sat Aug 23 16:11:01 2008
@@ -32,29 +32,30 @@
   STATE_START,    
   STATE_END,        
   STATE_REPOSITORY, 
+  STATE_INCLUDE,  
   STATE_NAMESPACE,  
-  STATE_ENUM,        
-  STATE_BITFIELD,  /* 5 */  
+  STATE_ENUM,      /* 5 */    
+  STATE_BITFIELD,  
   STATE_FUNCTION,   
   STATE_FUNCTION_RETURN, 
   STATE_FUNCTION_PARAMETERS,
-  STATE_FUNCTION_PARAMETER, 
-  STATE_CLASS,   /* 10 */
+  STATE_FUNCTION_PARAMETER,  /* 10 */
+  STATE_CLASS,  
   STATE_CLASS_FIELD,
   STATE_CLASS_PROPERTY,
   STATE_INTERFACE,
-  STATE_INTERFACE_PROPERTY, 
-  STATE_INTERFACE_FIELD,  /* 15 */
+  STATE_INTERFACE_PROPERTY,   /* 15 */
+  STATE_INTERFACE_FIELD,
   STATE_IMPLEMENTS, 
   STATE_REQUIRES,
   STATE_BOXED,  
-  STATE_BOXED_FIELD,
-  STATE_STRUCT,   /* 20 */
+  STATE_BOXED_FIELD, /* 20 */
+  STATE_STRUCT,   
   STATE_STRUCT_FIELD,
   STATE_ERRORDOMAIN, 
   STATE_UNION,
-  STATE_UNION_FIELD,
-  STATE_NAMESPACE_CONSTANT, /* 25 */
+  STATE_UNION_FIELD, /* 25 */
+  STATE_NAMESPACE_CONSTANT, 
   STATE_CLASS_CONSTANT, 
   STATE_INTERFACE_CONSTANT,
   STATE_ALIAS,
@@ -1922,6 +1923,12 @@
       break;
 
     case 'i':
+      if (strcmp (element_name, "include") == 0 &&
+	  ctx->state == STATE_REPOSITORY)
+	{
+	  state_switch (ctx, STATE_INCLUDE);
+	  goto out;
+	}
       if (start_interface (context, element_name, 
 			   attribute_names, attribute_values,
 			   ctx, error))
@@ -2174,6 +2181,13 @@
       state_switch (ctx, STATE_END);
       break;
 
+    case STATE_INCLUDE:
+      if (require_end_element (context, ctx, "include", element_name, error))
+	{
+          state_switch (ctx, STATE_REPOSITORY);
+        }
+      break;
+
     case STATE_NAMESPACE:
       if (require_end_element (context, ctx, "namespace", element_name, error))
 	{

Modified: trunk/giscanner/girparser.py
==============================================================================
--- trunk/giscanner/girparser.py	(original)
+++ trunk/giscanner/girparser.py	Sat Aug 23 16:11:01 2008
@@ -45,6 +45,7 @@
 
     def __init__(self, filename):
         self._nodes = []
+        self._includes = set()
         self._namespace_name = None
 
         tree = parse(filename)
@@ -55,6 +56,9 @@
     def get_namespace_name(self):
         return self._namespace_name
 
+    def get_includes(self):
+        return self._includes
+
     def get_nodes(self):
         return self._nodes
 
@@ -65,6 +69,9 @@
 
     def _parse_api(self, root):
         assert root.tag == _corens('repository')
+        for node in root.getchildren():
+            if node.tag == _corens('include'):
+                self._includes.add(node.attrib['name'])
         ns = root.find(_corens('namespace'))
         assert ns is not None
         self._namespace_name = ns.attrib['name']

Modified: trunk/giscanner/girwriter.py
==============================================================================
--- trunk/giscanner/girwriter.py	(original)
+++ trunk/giscanner/girwriter.py	Sat Aug 23 16:11:01 2008
@@ -31,11 +31,11 @@
 
 class GIRWriter(XMLWriter):
 
-    def __init__(self, namespace, shlib):
+    def __init__(self, namespace, shlib, includes):
         super(GIRWriter, self).__init__()
-        self._write_repository(namespace, shlib)
+        self._write_repository(namespace, shlib, includes)
 
-    def _write_repository(self, namespace, shlib):
+    def _write_repository(self, namespace, shlib, includes=set()):
         attrs = [
             ('version', '1.0'),
             ('xmlns', 'http://www.gtk.org/introspection/core/1.0'),
@@ -43,8 +43,14 @@
             ('xmlns:glib', 'http://www.gtk.org/introspection/glib/1.0'),
             ]
         with self.tagcontext('repository', attrs):
+            for include in includes:
+                self._write_include(include)
             self._write_namespace(namespace, shlib)
 
+    def _write_include(self, include):
+        attrs = [('name', include)]
+        self.write_tag('include', attrs)
+
     def _write_namespace(self, namespace, shlib):
         attrs = [('name', namespace.name),
                  ('shared-library', os.path.basename(shlib))]

Modified: trunk/giscanner/transformer.py
==============================================================================
--- trunk/giscanner/transformer.py	(original)
+++ trunk/giscanner/transformer.py	Sat Aug 23 16:11:01 2008
@@ -18,6 +18,8 @@
 # 02110-1301, USA.
 #
 
+import os
+
 from giscanner.ast import (Callback, Enum, Function, Namespace, Member,
                            Parameter, Return, Sequence, Struct, Field,
                            Type, Alias, Interface, Class, Node, Union,
@@ -33,6 +35,9 @@
 from .odict import odict
 from .utils import strip_common_prefix
 
+_xdg_data_dirs = [x for x in os.environ.get('XDG_DATA_DIRS', '').split(':') \
+                      + ['/usr/share'] if x]
+
 
 class SkipError(Exception):
     pass
@@ -60,10 +65,15 @@
         self._names = Names()
         self._typedefs_ns = {}
         self._strip_prefix = ''
+        self._includes = set()
+        self._includepaths = []
 
     def get_names(self):
         return self._names
 
+    def get_includes(self):
+        return self._includes
+
     def set_strip_prefix(self, strip_prefix):
         self._strip_prefix = strip_prefix
 
@@ -75,14 +85,38 @@
         return self._namespace
 
     def register_include(self, filename):
-        if filename.endswith('.gir'):
+        (path, suffix) = os.path.splitext(filename)
+        name = os.path.basename(path)
+        if name in self._includes:
+            return
+        if suffix == '':
+            suffix = '.gir'
+            filename = path + suffix
+        if suffix == '.gir':
+            source = filename
+            if not os.path.exists(filename):
+                searchdirs = [os.path.join(d, 'gir') for d \
+                                  in _xdg_data_dirs]
+                searchdirs.extend(self._includepaths)
+                source = None
+                for d in searchdirs:
+                    source = os.path.join(d, filename)
+                    if os.path.exists(source):
+                        break
+                    source = None
+            if not source:
+                raise ValueError("Couldn't find include %r (search path: %r)"\
+                                     % (filename, searchdirs))
+            d = os.path.dirname(source)
+            if d not in self._includepaths:
+                self._includepaths.append(d)
+            self._includes.add(name)
             from .girparser import GIRParser
-            parser = GIRParser(filename)
-        elif filename.endswith('.gidl'):
-            from .gidlparser import GIDLParser
-            parser = GIDLParser(filename)
+            parser = GIRParser(source)
         else:
             raise NotImplementedError(filename)
+        for include in parser.get_includes():
+            self.register_include(include)
         nsname = parser.get_namespace_name()
         for node in parser.get_nodes():
             if isinstance(node, Alias):

Modified: trunk/tests/scanner/Makefile.am
==============================================================================
--- trunk/tests/scanner/Makefile.am	(original)
+++ trunk/tests/scanner/Makefile.am	Sat Aug 23 16:11:01 2008
@@ -30,7 +30,6 @@
 
 %.gir: lib%.la %.c %.h utility.gir $(SCANNER) $(SCANNER_LIBS)
 	$(CHECK_DEBUG) $(SCANNER) -v \
-	--include=$(top_srcdir)/gir/GLib.gir \
 	--include=$(top_srcdir)/gir/GObject.gir \
 	--include=$(top_builddir)/tests/scanner/utility.gir \
 	--library=$< \
@@ -44,7 +43,6 @@
 
 utility.gir: libutility.la utility.h $(SCANNER) $(SCANNER_LIBS)
 	$(CHECK_DEBUG) $(SCANNER) -v \
-	--include=$(top_srcdir)/gir/GLib.gir \
 	--include=$(top_srcdir)/gir/GObject.gir \
 	--library=$< \
 	--namespace=$* \

Modified: trunk/tests/scanner/annotation-expected.gir
==============================================================================
--- trunk/tests/scanner/annotation-expected.gir	(original)
+++ trunk/tests/scanner/annotation-expected.gir	Sat Aug 23 16:11:01 2008
@@ -3,6 +3,8 @@
             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";>
+  <include name="GLib"/>
+  <include name="GObject"/>
   <namespace name="annotation" shared-library="libannotation.la">
     <record name="Object" c:type="AnnotationObject">
       <field name="parent_instance">

Modified: trunk/tests/scanner/drawable-expected.gir
==============================================================================
--- trunk/tests/scanner/drawable-expected.gir	(original)
+++ trunk/tests/scanner/drawable-expected.gir	Sat Aug 23 16:11:01 2008
@@ -3,6 +3,8 @@
             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";>
+  <include name="GLib"/>
+  <include name="GObject"/>
   <namespace name="drawable" shared-library="libdrawable.la">
     <class name="TestDrawable"
            c:type="TestDrawable"

Modified: trunk/tests/scanner/foo-expected.gir
==============================================================================
--- trunk/tests/scanner/foo-expected.gir	(original)
+++ trunk/tests/scanner/foo-expected.gir	Sat Aug 23 16:11:01 2008
@@ -3,6 +3,9 @@
             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";>
+  <include name="GLib"/>
+  <include name="GObject"/>
+  <include name="utility"/>
   <namespace name="foo" shared-library="libfoo.la">
     <alias name="List" target="GLib.SList" c:type="FooList"/>
     <alias name="XEvent" target="none" c:type="FooXEvent"/>

Modified: trunk/tests/scanner/utility-expected.gir
==============================================================================
--- trunk/tests/scanner/utility-expected.gir	(original)
+++ trunk/tests/scanner/utility-expected.gir	Sat Aug 23 16:11:01 2008
@@ -3,6 +3,8 @@
             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";>
+  <include name="GLib"/>
+  <include name="GObject"/>
   <namespace name="utility" shared-library="libutility.la">
     <class name="Object"
            c:type="UtilityObject"

Modified: trunk/tools/g-ir-scanner
==============================================================================
--- trunk/tools/g-ir-scanner	(original)
+++ trunk/tools/g-ir-scanner	Sat Aug 23 16:11:01 2008
@@ -179,7 +179,7 @@
     namespace = glibtransformer.parse()
 
     # Write out AST
-    writer = Writer(namespace, primary_library)
+    writer = Writer(namespace, primary_library, transformer.get_includes())
     data = writer.get_xml()
     if options.output:
         fd = open(options.output, "w")



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