gobject-introspection r283 - in trunk: . giscanner tests/parser



Author: johan
Date: Tue Jun  3 23:32:04 2008
New Revision: 283
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=283&view=rev

Log:
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



Added:
   trunk/giscanner/utils.py   (contents, props changed)
Modified:
   trunk/ChangeLog
   trunk/giscanner/Makefile.am
   trunk/giscanner/ast.py
   trunk/giscanner/girwriter.py
   trunk/giscanner/glibast.py
   trunk/giscanner/glibtransformer.py
   trunk/giscanner/transformer.py
   trunk/tests/parser/Foo-expected.gir

Modified: trunk/giscanner/Makefile.am
==============================================================================
--- trunk/giscanner/Makefile.am	(original)
+++ trunk/giscanner/Makefile.am	Tue Jun  3 23:32:04 2008
@@ -38,6 +38,7 @@
 	odict.py		\
 	sourcescanner.py	\
 	transformer.py		\
+	utils.py		\
 	xmlwriter.py
 
 _giscanner_la_CFLAGS = \

Modified: trunk/giscanner/ast.py
==============================================================================
--- trunk/giscanner/ast.py	(original)
+++ trunk/giscanner/ast.py	Tue Jun  3 23:32:04 2008
@@ -135,9 +135,10 @@
 
 
 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)

Modified: trunk/giscanner/girwriter.py
==============================================================================
--- trunk/giscanner/girwriter.py	(original)
+++ trunk/giscanner/girwriter.py	Tue Jun  3 23:32:04 2008
@@ -147,7 +147,8 @@
 
     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)

Modified: trunk/giscanner/glibast.py
==============================================================================
--- trunk/giscanner/glibast.py	(original)
+++ trunk/giscanner/glibast.py	Tue Jun  3 23:32:04 2008
@@ -41,8 +41,8 @@
 
 
 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
 
 

Modified: trunk/giscanner/glibtransformer.py
==============================================================================
--- trunk/giscanner/glibtransformer.py	(original)
+++ trunk/giscanner/glibtransformer.py	Tue Jun  3 23:32:04 2008
@@ -19,7 +19,6 @@
 #
 
 import ctypes
-import re
 import os
 
 from . import cgobject
@@ -28,30 +27,7 @@
                   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 @@
         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 @@
 
         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)

Modified: trunk/giscanner/transformer.py
==============================================================================
--- trunk/giscanner/transformer.py	(original)
+++ trunk/giscanner/transformer.py	Tue Jun  3 23:32:04 2008
@@ -27,6 +27,7 @@
     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 @@
     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 @@
             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):

Added: trunk/giscanner/utils.py
==============================================================================
--- (empty file)
+++ trunk/giscanner/utils.py	Tue Jun  3 23:32:04 2008
@@ -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:]
+    

Modified: trunk/tests/parser/Foo-expected.gir
==============================================================================
--- trunk/tests/parser/Foo-expected.gir	(original)
+++ trunk/tests/parser/Foo-expected.gir	Tue Jun  3 23:32:04 2008
@@ -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"



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]