diff options
author | Colin Walters <walters@src.gnome.org> | 2008-09-29 19:03:44 +0000 |
---|---|---|
committer | Colin Walters <walters@src.gnome.org> | 2008-09-29 19:03:44 +0000 |
commit | e5840f2da6c58e736c61b2b36bc128e1c418c0a8 (patch) | |
tree | b6e6e62e08131f4455a83057c1fcb0da172b27bb /giscanner/girparser.py | |
parent | d2465ce9ccefc6921eb5b3558b7db18f87a4f867 (diff) | |
download | gobject-introspection-e5840f2da6c58e736c61b2b36bc128e1c418c0a8.tar.gz |
Rework to use recursive XML
svn path=/trunk/; revision=637
Diffstat (limited to 'giscanner/girparser.py')
-rw-r--r-- | giscanner/girparser.py | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/giscanner/girparser.py b/giscanner/girparser.py index f3eedf14..09b58cf7 100644 --- a/giscanner/girparser.py +++ b/giscanner/girparser.py @@ -21,7 +21,7 @@ from xml.etree.cElementTree import parse from .ast import (Alias, Callback, Function, Parameter, Return, Union, - Struct, Type) + Struct, Type, Array) from .glibast import (GLibEnum, GLibEnumMember, GLibFlags, GLibInterface, GLibObject, GLibBoxedStruct, GLibBoxedUnion, GLibBoxedOther) @@ -128,7 +128,10 @@ class GIRParser(object): def _parse_function(self, node, klass): name = node.attrib['name'] - retval = Return(self._parse_type(node.find(_corens('return-value')))) + returnnode = node.find(_corens('return-value')) + if not returnnode: + raise ValueError('node %r has no return-value' % (name, )) + retval = Return(self._parse_type(returnnode)) parameters = [] for paramnode in node.findall('parameter'): parameters.append(Parameter(paramnode.attrib['name'], @@ -164,10 +167,15 @@ class GIRParser(object): def _parse_type(self, node): typenode = node.find(_corens('type')) - if node is None: - raise ValueError("failed to find type") - return Type(typenode.attrib['name'], - typenode.attrib[_cns('type')]) + if typenode is not None: + return Type(typenode.attrib['name'], + typenode.attrib.get(_cns('type'))) + typenode = node.find(_corens('array')) + if typenode is not None: + return Array(typenode.attrib[_cns('type')], + self._parse_type(typenode)) + raise ValueError("Couldn't parse type of node %r; children=%r", + node, list(node)) def _parse_boxed(self, node): obj = GLibBoxedOther(node.attrib[_glibns('name')], |