diff options
Diffstat (limited to 'giscanner')
-rw-r--r-- | giscanner/glibtransformer.py | 5 | ||||
-rw-r--r-- | giscanner/transformer.py | 41 | ||||
-rw-r--r-- | giscanner/utils.py | 11 |
3 files changed, 42 insertions, 15 deletions
diff --git a/giscanner/glibtransformer.py b/giscanner/glibtransformer.py index 61d4cef..0f5b0c9 100644 --- a/giscanner/glibtransformer.py +++ b/giscanner/glibtransformer.py @@ -640,7 +640,10 @@ class GLibTransformer(object): def _introspect_enum(self, node): members = [] for member in node.findall('member'): - members.append(GLibEnumMember(member.attrib['nick'], + # Keep the name closer to what we'd take from C by default; + # see http://bugzilla.gnome.org/show_bug.cgi?id=575613 + name = member.attrib['nick'].replace('-', '_') + members.append(GLibEnumMember(name, member.attrib['value'], member.attrib['name'], member.attrib['nick'])) diff --git a/giscanner/transformer.py b/giscanner/transformer.py index 9aebbd8..2746b6e 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -37,7 +37,7 @@ from .sourcescanner import ( CSYMBOL_TYPE_ENUM, CSYMBOL_TYPE_UNION, CSYMBOL_TYPE_OBJECT, CSYMBOL_TYPE_MEMBER, CSYMBOL_TYPE_ELLIPSIS, CSYMBOL_TYPE_CONST, TYPE_QUALIFIER_CONST) -from .utils import strip_common_prefix, to_underscores +from .utils import to_underscores _xdg_data_dirs = [x for x in os.environ.get('XDG_DATA_DIRS', '').split(':') \ + [DATADIR, '/usr/share'] if x] @@ -208,11 +208,46 @@ class Transformer(object): raise NotImplementedError( 'Transformer: unhandled symbol: %r' % (symbol, )) + def _enum_common_prefix(self, symbol): + def common_prefix(a, b): + alen = len(a) + blen = len(b) + l = min(alen, blen) + for i in xrange(l): + if a[i] != b[i]: + return a[:i] + if alen > blen: + return b + return a + # Nothing less than 2 has a common prefix + if len(list(symbol.base_type.child_list)) < 2: + return None + prefix = None + for child in symbol.base_type.child_list: + if prefix is None: + prefix = child.ident + else: + prefix = common_prefix(prefix, child.ident) + if prefix == '': + return None + return prefix + def _create_enum(self, symbol): + prefix = self._enum_common_prefix(symbol) + if prefix: + prefixlen = len(prefix) + else: + prefixlen = 0 members = [] for child in symbol.base_type.child_list: - name = strip_common_prefix(symbol.ident, child.ident).lower() - members.append(Member(name, + if prefixlen > 0: + name = child.ident[prefixlen:] + else: + # Ok, the enum members don't have a consistent prefix + # among them, so let's just remove the global namespace + # prefix. + name = self.remove_prefix(child.ident) + members.append(Member(name.lower(), child.const_int, child.ident)) diff --git a/giscanner/utils.py b/giscanner/utils.py index 021ffea..d2752e7 100644 --- a/giscanner/utils.py +++ b/giscanner/utils.py @@ -57,14 +57,3 @@ def extract_libtool(libname): # and pre-2.2. Johan 2008-10-21 libname = libname.replace('.libs/.libs', '.libs') return libname - - -def strip_common_prefix(first, second): - max_index = second.rfind('_') - second_len = len(second) - second = second.replace('_', '') - max_index -= second_len - len(second) - 1 - for i, c in enumerate(first.upper()): - if i >= len(second) or c != second[i] or i == max_index: - return second[i:] - return second[i + 1:] |