summaryrefslogtreecommitdiff
path: root/giscanner/transformer.py
diff options
context:
space:
mode:
Diffstat (limited to 'giscanner/transformer.py')
-rw-r--r--giscanner/transformer.py38
1 files changed, 22 insertions, 16 deletions
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index 6622602c..f1dd2fa1 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -22,11 +22,11 @@ from giscanner.ast import (Callback, Enum, Function, Namespace, Member,
Parameter, Return, Sequence, Struct, Type)
from giscanner.sourcescanner import (
SourceSymbol, ctype_name, symbol_type_name, CTYPE_POINTER,
- CTYPE_BASIC_TYPE, CTYPE_UNION,
+ CTYPE_BASIC_TYPE, CTYPE_UNION, CTYPE_ARRAY,
CTYPE_TYPEDEF, CTYPE_VOID, CTYPE_BASIC_TYPE, CTYPE_ENUM,
CTYPE_FUNCTION, CTYPE_STRUCT, CSYMBOL_TYPE_FUNCTION,
CSYMBOL_TYPE_TYPEDEF, CSYMBOL_TYPE_STRUCT, CSYMBOL_TYPE_ENUM,
- CSYMBOL_TYPE_UNION, CSYMBOL_TYPE_OBJECT)
+ CSYMBOL_TYPE_UNION, CSYMBOL_TYPE_OBJECT, CSYMBOL_TYPE_MEMBER)
class Transformer(object):
@@ -113,13 +113,14 @@ class Transformer(object):
return self._create_enum(symbol)
elif stype == CSYMBOL_TYPE_OBJECT:
return self._create_object(symbol)
+ elif stype == CSYMBOL_TYPE_MEMBER:
+ return self._create_member(symbol)
elif stype == CSYMBOL_TYPE_UNION:
# Unions are not supported
pass
else:
raise NotImplementedError(
- 'Transformer: unhandled symbol: %r of type %s'
- % (symbol.ident, symbol_type_name(stype)))
+ 'Transformer: unhandled symbol: %r' % (symbol,))
def _create_enum(self, symbol):
members = []
@@ -131,7 +132,7 @@ class Transformer(object):
return Enum(name, symbol.ident, members)
def _create_object(self, symbol):
- return Member(symbol.ident, symbol.base_type.name)
+ return self._create_member(symbol)
def _create_function(self, symbol):
directives = symbol.directives()
@@ -140,7 +141,6 @@ class Transformer(object):
directives.get('return', []))
name = self._remove_prefix(symbol.ident)
name = self._strip_namespace_func(name)
-
return Function(name, return_, parameters, symbol.ident)
def _create_source_type(self, source_type):
@@ -152,11 +152,13 @@ class Transformer(object):
value = source_type.name
elif source_type.type == CTYPE_TYPEDEF:
value = source_type.name
+ elif source_type.type == CTYPE_ARRAY:
+ return self._create_source_type(source_type.base_type)
elif source_type.type == CTYPE_POINTER:
value = self._create_source_type(source_type.base_type) + '*'
else:
- print 'BUILDER: Unhandled source type %s' % (
- ctype_name(source_type.type),)
+ print 'TRANSFORMER: Unhandled source type %r' % (
+ source_type,)
value = '???'
return value
@@ -167,6 +169,15 @@ class Transformer(object):
yield self._create_parameter(
child, options.get(child.ident, []))
+ def _create_member(self, symbol):
+ ctype = symbol.base_type.type
+ if (ctype == CTYPE_POINTER and
+ symbol.base_type.base_type.type == CTYPE_FUNCTION):
+ node = self._create_callback(symbol)
+ else:
+ node = Member(symbol.ident, self._create_source_type(symbol))
+ return node
+
def _create_typedef(self, symbol):
ctype = symbol.base_type.type
if (ctype == CTYPE_POINTER and
@@ -179,7 +190,8 @@ class Transformer(object):
elif ctype in (CTYPE_TYPEDEF,
CTYPE_POINTER,
CTYPE_BASIC_TYPE,
- CTYPE_UNION):
+ CTYPE_UNION,
+ CTYPE_VOID):
return
else:
raise NotImplementedError(
@@ -241,13 +253,7 @@ class Transformer(object):
struct = Struct(name, symbol.ident)
for child in symbol.base_type.child_list:
- # FIXME: This is obviously wrong, we're sending in data
- # of the wrong type to _traverse_one
- try:
- field = self._traverse_one(child, child.base_type.type)
- except NotImplementedError:
- continue
-
+ field = self._traverse_one(child)
if field:
struct.fields.append(field)