From 7e63a6289afb7d9162b47853fdbce63a5ef337db Mon Sep 17 00:00:00 2001 From: Johan Dahlin Date: Mon, 18 Aug 2008 18:01:21 +0000 Subject: [PATCH] Set ctype of enums Improve enum parsing for enums without a GType. Make 2008-08-18 Johan Dahlin * gir/Makefile.am: * giscanner/girparser.py: Set ctype of enums * giscanner/transformer.py: Improve enum parsing for enums without a GType. Make flags/enum references to other girs work * giscanner/utils.py: Simplify this a bit * tests/scanner/Makefile.am: * tests/scanner/foo-object.h: * tests/scanner/utility-expected.gir: * tests/scanner/utility.h: Add a new test for external enum references svn path=/trunk/; revision=397 --- ChangeLog | 16 ++++++++++++++++ gir/Makefile.am | 1 + giscanner/girparser.py | 5 ++--- giscanner/transformer.py | 7 ++++--- giscanner/utils.py | 4 ++-- tests/scanner/Makefile.am | 2 ++ tests/scanner/foo-object.h | 5 +++++ tests/scanner/utility-expected.gir | 10 ++++++++++ tests/scanner/utility.h | 14 ++++++++++++++ 9 files changed, 56 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5048052..bbbb7c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,21 @@ 2008-08-18 Johan Dahlin + * gir/Makefile.am: + * giscanner/girparser.py: + Set ctype of enums + * giscanner/transformer.py: + Improve enum parsing for enums without a GType. + Make flags/enum references to other girs work + * giscanner/utils.py: + Simplify this a bit + * tests/scanner/Makefile.am: + * tests/scanner/foo-object.h: + * tests/scanner/utility-expected.gir: + * tests/scanner/utility.h: + Add a new test for external enum references + +2008-08-18 Johan Dahlin + * docs/global-module-registry.txt: Update * tests/array.gir: Update with new type proposal diff --git a/gir/Makefile.am b/gir/Makefile.am index fe4f909..5f757cd 100644 --- a/gir/Makefile.am +++ b/gir/Makefile.am @@ -49,6 +49,7 @@ gio-2.0.gir: $(G_IR_SCANNER) $(G_IR_SCANNER_FILES) -I$(GIO_LIBDIR)/glib-2.0/include \ -DGIO_COMPILATION \ --pkg glib-2.0 \ + --pkg gobject-2.0 \ $(GLIB_INCLUDEDIR)/gio/*.h BUILT_SOURCES += gio-2.0.gir CLEANFILES = $(BUILT_SOURCES) diff --git a/giscanner/girparser.py b/giscanner/girparser.py index ef441a9..d326f1b 100644 --- a/giscanner/girparser.py +++ b/giscanner/girparser.py @@ -158,13 +158,12 @@ class GIRParser(object): def _parse_enumeration_bitfield(self, node): klass = (GLibFlags if node.tag == _corens('bitfield') else GLibEnum) - members = [] for member in node.findall(_corens('member')): members.append(self._parse_member(member)) - obj = klass(node.attrib.get(_corens('name')), + obj = klass(node.attrib.get('name'), node.attrib.get(_glibns('type-name')), members, node.attrib.get(_glibns('get-type'))) - + obj.ctype = node.attrib.get(_cns('type')) self._add_node(obj) diff --git a/giscanner/transformer.py b/giscanner/transformer.py index 72c1daa..894086d 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -76,12 +76,12 @@ class Transformer(object): raise NotImplementedError(filename) nsname = parser.get_namespace_name() for node in parser.get_nodes(): - if hasattr(node, 'ctype'): - self._ctype_names[node.ctype] = (nsname, node) if isinstance(node, (GLibBoxed, Interface, Class)): self._type_names[node.type_name] = (nsname, node) elif isinstance(node, Alias): self._alias_names[node.name] = (nsname, node) + elif hasattr(node, 'ctype'): + self._ctype_names[node.ctype] = (nsname, node) else: self._type_names[node.name] = (nsname, node) @@ -157,6 +157,7 @@ class Transformer(object): enum_name = self.strip_namespace_object(symbol.ident) enum_name = symbol.ident[-len(enum_name):] + enum_name = self._remove_prefix(enum_name) enum = Enum(enum_name, symbol.ident, members) self._type_names[symbol.ident] = (None, enum) return enum @@ -191,7 +192,7 @@ class Transformer(object): else: print 'TRANSFORMER: Unhandled source type %r' % ( source_type, ) - value = '???' + value = 'any' return value def _create_parameters(self, base_type, options=None): diff --git a/giscanner/utils.py b/giscanner/utils.py index bc70291..a41d3d6 100644 --- a/giscanner/utils.py +++ b/giscanner/utils.py @@ -48,8 +48,8 @@ def extract_libtool(libname): def strip_common_prefix(first, second): - first_underscore = to_underscores(first) - for i, c in enumerate(first_underscore.upper()): + second = second.replace('_', '') + for i, c in enumerate(first.upper()): if c != second[i]: break return second[i:] diff --git a/tests/scanner/Makefile.am b/tests/scanner/Makefile.am index a08e0f1..47a5015 100644 --- a/tests/scanner/Makefile.am +++ b/tests/scanner/Makefile.am @@ -22,6 +22,7 @@ SCANNER_LIBS = $(top_srcdir)/giscanner/*.py $(top_builddir)/giscanner/libgiscann utility.gir: libutility.la utility.h $(SCANNER) $(SCANNER_LIBS) $(CHECK_DEBUG) $(SCANNER) -v \ + --include=$(top_srcdir)/gir/glib-2.0.gir \ --include=$(top_srcdir)/gir/gobject-2.0.gir \ --library=libutility.la \ --namespace=utility \ @@ -31,6 +32,7 @@ utility.gir: libutility.la utility.h $(SCANNER) $(SCANNER_LIBS) Foo.gir: libfoo.la foo-object.h $(SCANNER) $(SCANNER_LIBS) $(CHECK_DEBUG) $(SCANNER) -v \ + --include=$(top_srcdir)/gir/glib-2.0.gir \ --include=$(top_srcdir)/gir/gobject-2.0.gir \ --include=$(top_builddir)/tests/scanner/utility.gir \ --library=libfoo.la \ diff --git a/tests/scanner/foo-object.h b/tests/scanner/foo-object.h index 2ac7646..bc2d993 100644 --- a/tests/scanner/foo-object.h +++ b/tests/scanner/foo-object.h @@ -150,4 +150,9 @@ struct _FooRectangle gint height; }; +void +foo_method_external_references (UtilityObject *object, + UtilityEnumType e, + UtilityFlagType f); + #endif /* __FOO_OBJECT_H__ */ diff --git a/tests/scanner/utility-expected.gir b/tests/scanner/utility-expected.gir index eb07d75..465be5c 100644 --- a/tests/scanner/utility-expected.gir +++ b/tests/scanner/utility-expected.gir @@ -9,5 +9,15 @@ glib:type-name="UtilityObject" glib:get-type="utility_object_get_type"> + + + + + + + + + + diff --git a/tests/scanner/utility.h b/tests/scanner/utility.h index 5f390d6..27e76dc 100644 --- a/tests/scanner/utility.h +++ b/tests/scanner/utility.h @@ -22,4 +22,18 @@ struct _UtilityObjectClass GType utility_object_get_type (void) G_GNUC_CONST; +typedef enum +{ + UTILITY_ENUM_A, + UTILITY_ENUM_B, + UTILITY_ENUM_C +} UtilityEnumType; + +typedef enum +{ + UTILITY_FLAG_A, + UTILITY_FLAG_B, + UTILITY_FLAG_C +} UtilityFlagType; + #endif /* __UTILITY_H__ */ -- 2.7.4