summaryrefslogtreecommitdiff
path: root/giscanner/girparser.py
diff options
context:
space:
mode:
authorColin Walters <walters@src.gnome.org>2008-09-29 19:03:44 +0000
committerColin Walters <walters@src.gnome.org>2008-09-29 19:03:44 +0000
commite5840f2da6c58e736c61b2b36bc128e1c418c0a8 (patch)
treeb6e6e62e08131f4455a83057c1fcb0da172b27bb /giscanner/girparser.py
parentd2465ce9ccefc6921eb5b3558b7db18f87a4f867 (diff)
downloadgobject-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.py20
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')],