summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2008-08-23 16:11:01 +0000
committerColin Walters <walters@src.gnome.org>2008-08-23 16:11:01 +0000
commit6959cd0f881b7688895f7d881302c95754b5be7f (patch)
treecd62da2622a9cc182411f05130e21e8293d26088
parent1c4b0118f5bd60a398deb076a573f52e0aad38c6 (diff)
downloadgobject-introspection-6959cd0f881b7688895f7d881302c95754b5be7f.tar.gz
Ignore <include>. Parse them. Generate them. Process <include>
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. svn path=/trunk/; revision=467
-rw-r--r--ChangeLog13
-rw-r--r--gir/Makefile.am1
-rw-r--r--girepository/girparser.c34
-rw-r--r--giscanner/girparser.py7
-rw-r--r--giscanner/girwriter.py12
-rw-r--r--giscanner/transformer.py44
-rw-r--r--tests/scanner/Makefile.am2
-rw-r--r--tests/scanner/annotation-expected.gir2
-rw-r--r--tests/scanner/drawable-expected.gir2
-rw-r--r--tests/scanner/foo-expected.gir3
-rw-r--r--tests/scanner/utility-expected.gir2
-rwxr-xr-xtools/g-ir-scanner2
12 files changed, 102 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index ad44575d..4062c794 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2008-08-23 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.
+
2008-08-23 Johan Dahlin <johan@gnome.org>
* tests/scanner/Makefile.am:
diff --git a/gir/Makefile.am b/gir/Makefile.am
index e5e92396..60b01907 100644
--- a/gir/Makefile.am
+++ b/gir/Makefile.am
@@ -50,7 +50,6 @@ Gio.gir: GObject.gir $(G_IR_SCANNER) $(G_IR_SCANNER_FILES)
--noclosure \
--output $@ \
--strip-prefix=g \
- --include=$(top_builddir)/gir/GLib.gir \
--include=$(top_builddir)/gir/GObject.gir \
--library=gio-2.0 \
-I$(GIO_INCLUDEDIR) \
diff --git a/girepository/girparser.c b/girepository/girparser.c
index 9a321d2c..5b428564 100644
--- a/girepository/girparser.c
+++ b/girepository/girparser.c
@@ -32,29 +32,30 @@ typedef enum
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 @@ start_element_handler (GMarkupParseContext *context,
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 @@ end_element_handler (GMarkupParseContext *context,
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))
{
diff --git a/giscanner/girparser.py b/giscanner/girparser.py
index 5cf845f6..5c2f121a 100644
--- a/giscanner/girparser.py
+++ b/giscanner/girparser.py
@@ -45,6 +45,7 @@ class GIRParser(object):
def __init__(self, filename):
self._nodes = []
+ self._includes = set()
self._namespace_name = None
tree = parse(filename)
@@ -55,6 +56,9 @@ class GIRParser(object):
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 @@ class GIRParser(object):
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']
diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py
index c9b7f3d5..18ba1b8d 100644
--- a/giscanner/girwriter.py
+++ b/giscanner/girwriter.py
@@ -31,11 +31,11 @@ from .xmlwriter import XMLWriter
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 @@ class GIRWriter(XMLWriter):
('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))]
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index 475e728e..20960006 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -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 giscanner.sourcescanner import (
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 @@ class Transformer(object):
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 @@ class Transformer(object):
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):
diff --git a/tests/scanner/Makefile.am b/tests/scanner/Makefile.am
index 56401d71..bf6a2899 100644
--- a/tests/scanner/Makefile.am
+++ b/tests/scanner/Makefile.am
@@ -30,7 +30,6 @@ BUILT_SOURCES = $(TYPELIBS) $(TXMLS) $(GIRS)
%.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 @@ GIRS += foo.gir
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=$* \
diff --git a/tests/scanner/annotation-expected.gir b/tests/scanner/annotation-expected.gir
index 1db97fb5..d8f53497 100644
--- a/tests/scanner/annotation-expected.gir
+++ b/tests/scanner/annotation-expected.gir
@@ -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">
diff --git a/tests/scanner/drawable-expected.gir b/tests/scanner/drawable-expected.gir
index 9ab8c800..55d2266e 100644
--- a/tests/scanner/drawable-expected.gir
+++ b/tests/scanner/drawable-expected.gir
@@ -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"
diff --git a/tests/scanner/foo-expected.gir b/tests/scanner/foo-expected.gir
index a7bc4386..2bcfd4b9 100644
--- a/tests/scanner/foo-expected.gir
+++ b/tests/scanner/foo-expected.gir
@@ -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"/>
diff --git a/tests/scanner/utility-expected.gir b/tests/scanner/utility-expected.gir
index e682450f..b0f0bb8d 100644
--- a/tests/scanner/utility-expected.gir
+++ b/tests/scanner/utility-expected.gir
@@ -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"
diff --git a/tools/g-ir-scanner b/tools/g-ir-scanner
index 8951aa1f..af245981 100755
--- a/tools/g-ir-scanner
+++ b/tools/g-ir-scanner
@@ -179,7 +179,7 @@ def main(args):
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")