summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <jdahlin@async.com.br>2008-06-03 23:32:04 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-06-03 23:32:04 +0000
commite8b29ce05be743bb695959fc7f5fa6ccbc69fbe9 (patch)
treec88dd42ddb3d673fdc9cbb5d70d33bcdb7cc6beb
parent6b52e768cce135b576fd0ebee5e0531310ef42f4 (diff)
downloadgobject-introspection-e8b29ce05be743bb695959fc7f5fa6ccbc69fbe9.tar.gz
Improve enum member parsing and introspection
2008-06-03 Johan Dahlin <jdahlin@async.com.br> * giscanner/Makefile.am: * giscanner/ast.py: * giscanner/girwriter.py: * giscanner/glibast.py: * giscanner/glibtransformer.py: * giscanner/transformer.py: * giscanner/utils.py: * tests/parser/Foo-expected.gir: Improve enum member parsing and introspection svn path=/trunk/; revision=283
-rw-r--r--ChangeLog12
-rw-r--r--giscanner/Makefile.am1
-rw-r--r--giscanner/ast.py3
-rw-r--r--giscanner/girwriter.py3
-rw-r--r--giscanner/glibast.py4
-rw-r--r--giscanner/glibtransformer.py30
-rw-r--r--giscanner/transformer.py17
-rw-r--r--giscanner/utils.py53
-rw-r--r--tests/parser/Foo-expected.gir36
9 files changed, 114 insertions, 45 deletions
diff --git a/ChangeLog b/ChangeLog
index c6b41900..b15378e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-06-03 Johan Dahlin <jdahlin@async.com.br>
+
+ * giscanner/Makefile.am:
+ * giscanner/ast.py:
+ * giscanner/girwriter.py:
+ * giscanner/glibast.py:
+ * giscanner/glibtransformer.py:
+ * giscanner/transformer.py:
+ * giscanner/utils.py:
+ * tests/parser/Foo-expected.gir:
+ Improve enum member parsing and introspection
+
2008-05-31 Johan Dahlin <jdahlin@async.com.br>
* giscanner/scannerparser.y:
diff --git a/giscanner/Makefile.am b/giscanner/Makefile.am
index 931d4907..0da9b597 100644
--- a/giscanner/Makefile.am
+++ b/giscanner/Makefile.am
@@ -38,6 +38,7 @@ pkgpyexec_PYTHON = \
odict.py \
sourcescanner.py \
transformer.py \
+ utils.py \
xmlwriter.py
_giscanner_la_CFLAGS = \
diff --git a/giscanner/ast.py b/giscanner/ast.py
index ff1fa84d..be3962d8 100644
--- a/giscanner/ast.py
+++ b/giscanner/ast.py
@@ -135,9 +135,10 @@ class Enum(Node):
class Member(Node):
- def __init__(self, name, value):
+ def __init__(self, name, value, symbol):
Node.__init__(self, name)
self.value = value
+ self.symbol = symbol
def __repr__(self):
return 'Member(%r, %r)' % (self.name, self.value)
diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py
index 8d17fade..f26373b3 100644
--- a/giscanner/girwriter.py
+++ b/giscanner/girwriter.py
@@ -147,7 +147,8 @@ class GIRWriter(XMLWriter):
def _write_member(self, member):
attrs = [('name', member.name),
- ('value', str(member.value))]
+ ('value', str(member.value)),
+ ('c:identifier', member.symbol)]
if isinstance(member, GLibEnumMember):
attrs.append(('glib:nick', member.nick))
self.write_tag('member', attrs)
diff --git a/giscanner/glibast.py b/giscanner/glibast.py
index d50c503c..50d51c34 100644
--- a/giscanner/glibast.py
+++ b/giscanner/glibast.py
@@ -41,8 +41,8 @@ class GLibFlags(GLibEnum):
class GLibEnumMember(Member):
- def __init__(self, name, value, nick):
- Member.__init__(self, name, value)
+ def __init__(self, name, value, symbol, nick):
+ Member.__init__(self, name, value, symbol)
self.nick = nick
diff --git a/giscanner/glibtransformer.py b/giscanner/glibtransformer.py
index 782ec163..5099ac2e 100644
--- a/giscanner/glibtransformer.py
+++ b/giscanner/glibtransformer.py
@@ -19,7 +19,6 @@
#
import ctypes
-import re
import os
from . import cgobject
@@ -28,30 +27,7 @@ from .ast import (Callback, Enum, Function, Member, Namespace, Parameter,
Property, Return, Sequence, Struct, Type)
from .glibast import (GLibBoxed, GLibEnum, GLibEnumMember, GLibFlags,
GLibInterface, GLibObject, GLibSignal)
-
-
-# Copied from h2defs.py
-_upperstr_pat1 = re.compile(r'([^A-Z])([A-Z])')
-_upperstr_pat2 = re.compile(r'([A-Z][A-Z])([A-Z][0-9a-z])')
-_upperstr_pat3 = re.compile(r'^([A-Z])([A-Z])')
-
-def to_underscores(name):
- """Converts a typename to the equivalent underscores name.
- This is used to form the type conversion macros and enum/flag
- name variables"""
- name = _upperstr_pat1.sub(r'\1_\2', name)
- name = _upperstr_pat2.sub(r'\1_\2', name)
- name = _upperstr_pat3.sub(r'\1_\2', name, count=1)
- return name
-
-_libtool_pat = re.compile("dlname='([A-z0-9\.\-\+]+)'\n")
-
-def resolve_libtool(libname):
- data = open(libname).read()
- filename = _libtool_pat.search(data).groups()[0]
- libname = os.path.join(os.path.dirname(libname),
- '.libs', filename)
- return libname
+from .utils import resolve_libtool, to_underscores
class GLibTransformer(object):
@@ -169,6 +145,7 @@ class GLibTransformer(object):
except AttributeError:
print 'Warning: could not find symbol: %s' % symbol
return False
+
func.restype = cgobject.GType
func.argtypes = []
type_id = func()
@@ -275,8 +252,9 @@ class GLibTransformer(object):
members = []
for enum_value in type_class.get_values():
- members.append(GLibEnumMember(enum_value.value_name,
+ members.append(GLibEnumMember(enum_value.value_nick,
enum_value.value,
+ enum_value.value_name,
enum_value.value_nick))
klass = (GLibFlags if ftype_id == cgobject.TYPE_FLAGS else GLibEnum)
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index f322635a..3047d528 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -27,6 +27,7 @@ from giscanner.sourcescanner import (
CTYPE_FUNCTION, CTYPE_STRUCT, CSYMBOL_TYPE_FUNCTION,
CSYMBOL_TYPE_TYPEDEF, CSYMBOL_TYPE_STRUCT, CSYMBOL_TYPE_ENUM,
CSYMBOL_TYPE_UNION, CSYMBOL_TYPE_OBJECT, CSYMBOL_TYPE_MEMBER)
+from .utils import strip_common_prefix
class Transformer(object):
@@ -125,14 +126,17 @@ class Transformer(object):
def _create_enum(self, symbol):
members = []
for child in symbol.base_type.child_list:
- members.append(Member(child.ident,
- child.const_int))
+ name = strip_common_prefix(symbol.ident, child.ident).lower()
+ members.append(Member(name,
+ child.const_int,
+ child.ident))
- name = self.strip_namespace_object(symbol.ident)
- return Enum(name, symbol.ident, members)
+ enum_name = self.strip_namespace_object(symbol.ident)
+ return Enum(enum_name, symbol.ident, members)
def _create_object(self, symbol):
- return Member(symbol.ident, symbol.base_type.name)
+ return Member(symbol.ident, symbol.base_type.name,
+ symbol.ident)
def _create_function(self, symbol):
directives = symbol.directives()
@@ -175,7 +179,8 @@ class Transformer(object):
symbol.base_type.base_type.type == CTYPE_FUNCTION):
node = self._create_callback(symbol)
else:
- node = Member(symbol.ident, self._create_source_type(symbol))
+ node = Member(symbol.ident, self._create_source_type(symbol),
+ symbol.ident)
return node
def _create_typedef(self, symbol):
diff --git a/giscanner/utils.py b/giscanner/utils.py
new file mode 100644
index 00000000..488baadd
--- /dev/null
+++ b/giscanner/utils.py
@@ -0,0 +1,53 @@
+# -*- Mode: Python -*-
+# GObject-Introspection - a framework for introspecting GObject libraries
+# Copyright (C) 2008 Johan Dahlin
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+
+import re
+import os
+
+# Copied from h2defs.py
+_upperstr_pat1 = re.compile(r'([^A-Z])([A-Z])')
+_upperstr_pat2 = re.compile(r'([A-Z][A-Z])([A-Z][0-9a-z])')
+_upperstr_pat3 = re.compile(r'^([A-Z])([A-Z])')
+
+def to_underscores(name):
+ """Converts a typename to the equivalent underscores name.
+ This is used to form the type conversion macros and enum/flag
+ name variables"""
+ name = _upperstr_pat1.sub(r'\1_\2', name)
+ name = _upperstr_pat2.sub(r'\1_\2', name)
+ name = _upperstr_pat3.sub(r'\1_\2', name, count=1)
+ return name
+
+_libtool_pat = re.compile("dlname='([A-z0-9\.\-\+]+)'\n")
+
+def resolve_libtool(libname):
+ data = open(libname).read()
+ filename = _libtool_pat.search(data).groups()[0]
+ libname = os.path.join(os.path.dirname(libname),
+ '.libs', filename)
+ return libname
+
+def strip_common_prefix(first, second):
+ first_underscore = to_underscores(first)
+ for i, c in enumerate(first_underscore.upper()):
+ if c != second[i]:
+ break
+ return second[i:]
+
diff --git a/tests/parser/Foo-expected.gir b/tests/parser/Foo-expected.gir
index e4561c83..5dfd41f2 100644
--- a/tests/parser/Foo-expected.gir
+++ b/tests/parser/Foo-expected.gir
@@ -216,9 +216,18 @@
c:type="FooEnumType"
glib:type-name="FooEnumType"
glib:get-type="foo_enum_type_get_type">
- <member name="FOO_ENUM_ALPHA" value="0" glib:nick="alpha"/>
- <member name="FOO_ENUM_BETA" value="1" glib:nick="beta"/>
- <member name="FOO_ENUM_DELTA" value="2" glib:nick="delta"/>
+ <member name="alpha"
+ value="0"
+ c:identifier="FOO_ENUM_ALPHA"
+ glib:nick="alpha"/>
+ <member name="beta"
+ value="1"
+ c:identifier="FOO_ENUM_BETA"
+ glib:nick="beta"/>
+ <member name="delta"
+ value="2"
+ c:identifier="FOO_ENUM_DELTA"
+ glib:nick="delta"/>
</enumeration>
<function name="enum_type_method" c:identifier="foo_enum_type_method">
<return-value>
@@ -234,14 +243,23 @@
c:type="FooFlagsType"
glib:type-name="FooFlagsType"
glib:get-type="foo_flags_type_get_type">
- <member name="FOO_FLAGS_FIRST" value="1" glib:nick="first"/>
- <member name="FOO_FLAGS_SECOND" value="2" glib:nick="second"/>
- <member name="FOO_FLAGS_THIRD" value="4" glib:nick="third"/>
+ <member name="first"
+ value="1"
+ c:identifier="FOO_FLAGS_FIRST"
+ glib:nick="first"/>
+ <member name="second"
+ value="2"
+ c:identifier="FOO_FLAGS_SECOND"
+ glib:nick="second"/>
+ <member name="third"
+ value="4"
+ c:identifier="FOO_FLAGS_THIRD"
+ glib:nick="third"/>
</bitfield>
<enumeration name="EnumNoType" c:type="FooEnumNoType">
- <member name="FOO_ENUM_UN" value="1"/>
- <member name="FOO_ENUM_DEUX" value="2"/>
- <member name="FOO_ENUM_TROIS" value="3"/>
+ <member name="un" value="1" c:identifier="FOO_ENUM_UN"/>
+ <member name="deux" value="2" c:identifier="FOO_ENUM_DEUX"/>
+ <member name="trois" value="3" c:identifier="FOO_ENUM_TROIS"/>
</enumeration>
<glib:boxed c:type="Boxed"
glib:name="Boxed"