summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <jdahlin@async.com.br>2008-06-20 01:33:09 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-06-20 01:33:09 +0000
commitb9767e2fe9955e38612d890f9435cff14e215936 (patch)
treeb6866b39bc97a832801d042a7ba3a1c9811291d2
parente3559b1134b9bd590b184e40468ee17c13eeaa62 (diff)
downloadgobject-introspection-b9767e2fe9955e38612d890f9435cff14e215936.tar.gz
Start using abstract type instead of the raw C types. Register a bunch of
2008-06-19 Johan Dahlin <jdahlin@async.com.br> * giscanner/ast.py: * giscanner/girwriter.py: * giscanner/glibast.py: * giscanner/glibtransformer.py: * giscanner/transformer.py: * tests/parser/Foo-expected.gir: Start using abstract type instead of the raw C types. Register a bunch of glib types we care about. svn path=/trunk/; revision=290
-rw-r--r--ChangeLog11
-rw-r--r--giscanner/ast.py38
-rw-r--r--giscanner/girwriter.py2
-rw-r--r--giscanner/glibast.py27
-rw-r--r--giscanner/glibtransformer.py15
-rw-r--r--giscanner/transformer.py13
-rw-r--r--tests/parser/Foo-expected.gir48
7 files changed, 111 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog
index c3f1f444..7df92672 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-06-19 Johan Dahlin <jdahlin@async.com.br>
+
+ * giscanner/ast.py:
+ * giscanner/girwriter.py:
+ * giscanner/glibast.py:
+ * giscanner/glibtransformer.py:
+ * giscanner/transformer.py:
+ * tests/parser/Foo-expected.gir:
+ Start using abstract type instead of the raw C types.
+ Register a bunch of glib types we care about.
+
2008-06-19 Rob Taylor <rob.taylor@codethink.co.uk>
* AUTHORS:
diff --git a/giscanner/ast.py b/giscanner/ast.py
index 8f40d63f..80d5f968 100644
--- a/giscanner/ast.py
+++ b/giscanner/ast.py
@@ -72,7 +72,30 @@ PARAM_DIRECTION_IN = 'in'
PARAM_DIRECTION_OUT = 'out'
PARAM_DIRECTION_INOUT = 'inout'
-
+type_names = {}
+
+# C
+type_names['char'] = TYPE_CHAR
+type_names['unsigned char'] = TYPE_UCHAR
+type_names['short'] = TYPE_INT16
+type_names['unsigned short'] = TYPE_UINT16
+type_names['int'] = TYPE_INT32
+type_names['unsigned int'] = TYPE_UINT32
+type_names['long'] = TYPE_LONG
+type_names['unsigned long'] = TYPE_ULONG
+type_names['float'] = TYPE_FLOAT
+type_names['double'] = TYPE_DOUBLE
+type_names['char*'] = TYPE_STRING
+type_names['void*'] = TYPE_ANY
+type_names['void'] = TYPE_NONE
+type_names['size_t'] = TYPE_SIZE
+type_names['ssize_t'] = TYPE_SSIZE
+
+
+def type_name_from_ctype(ctype):
+ return type_names.get(ctype, ctype)
+
+
class Node(object):
def __init__(self, name=None):
self.name = name
@@ -108,9 +131,9 @@ class VFunction(Function):
class Type(Node):
- def __init__(self, name):
+ def __init__(self, name, ctype=None):
Node.__init__(self, name)
- self.ctype = name
+ self.ctype = ctype
class Parameter(Node):
@@ -212,9 +235,9 @@ class Constant(Node):
class Property(Node):
- def __init__(self, name, type_name):
+ def __init__(self, name, type_name, ctype=None):
Node.__init__(self, name)
- self.type = Type(type_name)
+ self.type = Type(type_name, ctype)
def __repr__(self):
return '%s(%r, %r, %r)' % (
@@ -236,7 +259,8 @@ class Callback(Node):
class Sequence(Type):
# Subclass, because a Sequence is a kind of Type
- def __init__(self, name, element_type):
- Type.__init__(self, name)
+ def __init__(self, name, ctype, element_type):
+ Type.__init__(self, name, ctype)
self.element_type = element_type
self.transfer = False
+
diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py
index 58eeccd0..389c05fa 100644
--- a/giscanner/girwriter.py
+++ b/giscanner/girwriter.py
@@ -118,7 +118,7 @@ class GIRWriter(XMLWriter):
# FIXME: figure out if type references a basic type
# or a boxed/class/interface etc. and skip
# writing the ctype if the latter.
- if 1:
+ if type.ctype is not None:
attrs.append(('c:type', type.ctype))
self.write_tag('type', attrs)
diff --git a/giscanner/glibast.py b/giscanner/glibast.py
index 50d51c34..db886db9 100644
--- a/giscanner/glibast.py
+++ b/giscanner/glibast.py
@@ -19,7 +19,32 @@
#
from .ast import Class, Enum, Interface, Member, Node, Property, Struct
-
+from .ast import (
+ type_names,
+ TYPE_STRING, TYPE_INT8, TYPE_UINT8, TYPE_INT16, TYPE_UINT16,
+ TYPE_INT32, TYPE_UINT32, TYPE_INT32, TYPE_UINT32, TYPE_LONG,
+ TYPE_ULONG, TYPE_FLOAT, TYPE_DOUBLE, TYPE_STRING, TYPE_BOOLEAN,
+ TYPE_ANY, TYPE_SIZE, TYPE_SSIZE)
+
+# Glib type names
+type_names['gchararray'] = TYPE_STRING
+type_names['gint8'] = TYPE_INT8
+type_names['guint8'] = TYPE_UINT8
+type_names['gint16'] = TYPE_INT16
+type_names['guint16'] = TYPE_UINT16
+type_names['gint'] = TYPE_INT32
+type_names['gyint'] = TYPE_UINT32
+type_names['gint32'] = TYPE_INT32
+type_names['guint32'] = TYPE_UINT32
+type_names['glong'] = TYPE_LONG
+type_names['gulong'] = TYPE_ULONG
+type_names['gfloat'] = TYPE_FLOAT
+type_names['gdouble'] = TYPE_DOUBLE
+type_names['gchar*'] = TYPE_STRING
+type_names['gboolean'] = TYPE_BOOLEAN
+type_names['gpointer'] = TYPE_ANY
+type_names['gsize'] = TYPE_SIZE
+type_names['gssize'] = TYPE_SSIZE
class GLibEnum(Enum):
def __init__(self, name, members, type_name, get_type):
diff --git a/giscanner/glibtransformer.py b/giscanner/glibtransformer.py
index dc4ba0b8..f84f0c6c 100644
--- a/giscanner/glibtransformer.py
+++ b/giscanner/glibtransformer.py
@@ -24,7 +24,8 @@ import os
from . import cgobject
from .odict import odict
from .ast import (Callback, Enum, Function, Member, Namespace, Parameter,
- Property, Return, Sequence, Struct, Type)
+ Property, Return, Sequence, Struct, Type,
+ type_name_from_ctype)
from .glibast import (GLibBoxed, GLibEnum, GLibEnumMember, GLibFlags,
GLibInterface, GLibObject, GLibSignal)
from .utils import resolve_libtool, to_underscores
@@ -228,8 +229,9 @@ class GLibTransformer(object):
node.fields.append(field)
def _create_type(self, type_id):
- type_name = cgobject.type_name(type_id)
- return Type(type_name)
+ ctype = cgobject.type_name(type_id)
+ type_name = type_name_from_ctype(ctype)
+ return Type(type_name, ctype)
def _introspect_type(self, type_id, symbol):
fundamental_type_id = cgobject.type_fundamental(type_id)
@@ -314,13 +316,16 @@ class GLibTransformer(object):
for pspec in pspecs:
if pspec.owner_type != type_id:
continue
+ ctype = cgobject.type_name(pspec.value_type)
node.properties.append(Property(
pspec.name,
- cgobject.type_name(pspec.value_type)))
+ type_name_from_ctype(ctype),
+ ctype,
+ ))
def _introspect_signals(self, node, type_id):
for signal_info in cgobject.signal_list(type_id):
- rtype = Type(cgobject.type_name(signal_info.return_type))
+ rtype = self._create_type(signal_info.return_type)
return_ = Return(rtype)
signal = GLibSignal(signal_info.signal_name, return_)
for i, parameter in enumerate(signal_info.get_params()):
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index 7562e157..5a6b021b 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -20,7 +20,7 @@
from giscanner.ast import (Callback, Enum, Function, Namespace, Member,
Parameter, Return, Sequence, Struct, Field,
- Type)
+ Type, type_name_from_ctype)
from giscanner.sourcescanner import (
SourceSymbol, ctype_name, symbol_type_name, CTYPE_POINTER,
CTYPE_BASIC_TYPE, CTYPE_UNION, CTYPE_ARRAY,
@@ -205,8 +205,9 @@ class Transformer(object):
return node
def _create_type(self, source_type):
- type_name = self._create_source_type(source_type)
- return Type(type_name)
+ ctype = self._create_source_type(source_type)
+ type_name = type_name_from_ctype(ctype)
+ return Type(type_name, ctype)
def _create_parameter(self, symbol, options):
ptype = self._create_type(symbol.base_type)
@@ -228,7 +229,7 @@ class Transformer(object):
def _create_return(self, source_type, options=None):
if not options:
options = []
- rtype = Type(self._create_source_type(source_type))
+ rtype = self._create_type(source_type)
rtype = self._resolve_param_type(rtype)
return_ = Return(rtype)
for option in options:
@@ -237,7 +238,9 @@ class Transformer(object):
elif option.startswith('seq '):
value, element_options = option[3:].split(None, 2)
element_type = self._parse_type_annotation(value)
- seq = Sequence(rtype.name, element_type)
+ seq = Sequence(rtype.name,
+ type_name_from_ctype(rtype.name),
+ element_type)
seq.transfer = True
return_.type = seq
else:
diff --git a/tests/parser/Foo-expected.gir b/tests/parser/Foo-expected.gir
index c9edac3c..ec144cb5 100644
--- a/tests/parser/Foo-expected.gir
+++ b/tests/parser/Foo-expected.gir
@@ -10,7 +10,7 @@
</interface>
<function name="init" c:identifier="foo_init">
<return-value>
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</return-value>
</function>
<class name="Object"
@@ -25,7 +25,7 @@
</constructor>
<method name="method" c:identifier="foo_object_method">
<return-value>
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</return-value>
<parameters>
<parameter name="object">
@@ -45,7 +45,7 @@
</method>
<method name="out" c:identifier="foo_object_out">
<return-value>
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</return-value>
<parameters>
<parameter name="object">
@@ -68,7 +68,7 @@
</method>
<method name="inout" c:identifier="foo_object_inout">
<return-value>
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</return-value>
<parameters>
<parameter name="object">
@@ -81,7 +81,7 @@
</method>
<method name="inout2" c:identifier="foo_object_inout2">
<return-value>
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</return-value>
<parameters>
<parameter name="object">
@@ -94,7 +94,7 @@
</method>
<method name="inout3" c:identifier="foo_object_inout3">
<return-value>
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</return-value>
<parameters>
<parameter name="object">
@@ -107,7 +107,7 @@
</method>
<method name="in" c:identifier="foo_object_in">
<return-value>
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</return-value>
<parameters>
<parameter name="object">
@@ -120,7 +120,7 @@
</method>
<method name="calleeowns" c:identifier="foo_object_calleeowns">
<return-value>
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</return-value>
<parameters>
<parameter name="object">
@@ -133,7 +133,7 @@
</method>
<method name="calleesowns" c:identifier="foo_object_calleesowns">
<return-value>
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</return-value>
<parameters>
<parameter name="object">
@@ -172,31 +172,31 @@
</parameters>
</method>
<property name="string">
- <type name="gchararray" c:type="gchararray"/>
+ <type name="string" c:type="gchararray"/>
</property>
<callback name="virtual_method">
<return-value>
- <type name="gboolean" c:type="gboolean"/>
+ <type name="boolean" c:type="gboolean"/>
</return-value>
<parameters>
<parameter name="object">
<type name="FooObject*" c:type="FooObject*"/>
</parameter>
<parameter name="first_param">
- <type name="int" c:type="int"/>
+ <type name="int32" c:type="int"/>
</parameter>
</parameters>
</callback>
<glib:signal name="signal">
<return-value>
- <type name="gchararray" c:type="gchararray"/>
+ <type name="string" c:type="gchararray"/>
</return-value>
<parameters>
<parameter name="object">
<type name="GObject" c:type="GObject"/>
</parameter>
<parameter name="p0">
- <type name="gpointer" c:type="gpointer"/>
+ <type name="any" c:type="gpointer"/>
</parameter>
</parameters>
</glib:signal>
@@ -231,7 +231,7 @@
</enumeration>
<function name="enum_type_method" c:identifier="foo_enum_type_method">
<return-value>
- <type name="int" c:type="int"/>
+ <type name="int32" c:type="int"/>
</return-value>
<parameters>
<parameter name="foo_enum">
@@ -272,7 +272,7 @@
</constructor>
<method name="method" c:identifier="foo_boxed_method">
<return-value>
- <type name="void" c:type="void"/>
+ <type name="none" c:type="void"/>
</return-value>
<parameters>
<parameter name="boxed">
@@ -283,17 +283,17 @@
</glib:boxed>
<callback name="FooCallback">
<return-value>
- <type name="gboolean" c:type="gboolean"/>
+ <type name="boolean" c:type="gboolean"/>
</return-value>
<parameters>
<parameter name="foo">
<type name="FooObject*" c:type="FooObject*"/>
</parameter>
<parameter name="b">
- <type name="gboolean" c:type="gboolean"/>
+ <type name="boolean" c:type="gboolean"/>
</parameter>
<parameter name="data">
- <type name="gpointer" c:type="gpointer"/>
+ <type name="any" c:type="gpointer"/>
</parameter>
</parameters>
</callback>
@@ -302,22 +302,22 @@
<type name="FooStructPrivate*" c:type="FooStructPrivate*"/>
</field>
<field name="member">
- <type name="int" c:type="int"/>
+ <type name="int32" c:type="int"/>
</field>
</record>
<record name="FooStructPrivate" c:type="FooStructPrivate"/>
<record name="FooRectangle" c:type="FooRectangle">
<field name="x">
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</field>
<field name="y">
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</field>
<field name="width">
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</field>
<field name="height">
- <type name="gint" c:type="gint"/>
+ <type name="int32" c:type="gint"/>
</field>
</record>
</namespace>