diff options
author | Johan Dahlin <jdahlin@async.com.br> | 2009-01-22 00:02:49 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2009-01-22 00:02:49 +0000 |
commit | f90b158f0563a23213678c8dabfbccc08aaa5fb5 (patch) | |
tree | 2c007c16f144af672e3e49b7f19f02fe8c9f9454 | |
parent | 4aa4dacaffe4ea0fe78ac97d0437d0563e12aacd (diff) | |
download | gobject-introspection-f90b158f0563a23213678c8dabfbccc08aaa5fb5.tar.gz |
Bug 562622 – Errordomains missing
2009-01-21 Johan Dahlin <jdahlin@async.com.br>
Bug 562622 – Errordomains missing
* giscanner/girwriter.py:
* giscanner/glibast.py:
* giscanner/glibtransformer.py:
* tests/scanner/Makefile.am:
* tests/scanner/foo-1.0-expected.gir:
* tests/scanner/foo-1.0-expected.tgir:
* tests/scanner/foo.c (foo_error_get_type), (foo_error_quark):
* tests/scanner/foo.h:
svn path=/trunk/; revision=1057
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | giscanner/girwriter.py | 3 | ||||
-rw-r--r-- | giscanner/glibast.py | 1 | ||||
-rw-r--r-- | giscanner/glibtransformer.py | 25 | ||||
-rw-r--r-- | tests/scanner/Makefile.am | 11 | ||||
-rw-r--r-- | tests/scanner/foo-1.0-expected.gir | 18 | ||||
-rw-r--r-- | tests/scanner/foo-1.0-expected.tgir | 5 | ||||
-rw-r--r-- | tests/scanner/foo.c | 22 | ||||
-rw-r--r-- | tests/scanner/foo.h | 9 |
9 files changed, 102 insertions, 5 deletions
@@ -1,3 +1,16 @@ +2009-01-21 Johan Dahlin <jdahlin@async.com.br> + + Bug 562622 – Errordomains missing + + * giscanner/girwriter.py: + * giscanner/glibast.py: + * giscanner/glibtransformer.py: + * tests/scanner/Makefile.am: + * tests/scanner/foo-1.0-expected.gir: + * tests/scanner/foo-1.0-expected.tgir: + * tests/scanner/foo.c (foo_error_get_type), (foo_error_quark): + * tests/scanner/foo.h: + 2009-01-20 Johan Dahlin <jdahlin@async.com.br> * giscanner/scannerlexer.l: diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py index 89af8fb9..51a208d7 100644 --- a/giscanner/girwriter.py +++ b/giscanner/girwriter.py @@ -240,8 +240,11 @@ and/or use gtk-doc annotations. ''') attrs.extend([('glib:type-name', enum.type_name), ('glib:get-type', enum.get_type), ('c:type', enum.ctype)]) + if enum.error_quark: + attrs.append(('glib:error-quark', enum.error_quark)) else: attrs.append(('c:type', enum.symbol)) + with self.tagcontext('enumeration', attrs): for member in enum.members: self._write_member(member) diff --git a/giscanner/glibast.py b/giscanner/glibast.py index 11a5ed0b..f61cd5f3 100644 --- a/giscanner/glibast.py +++ b/giscanner/glibast.py @@ -70,6 +70,7 @@ class GLibEnum(Enum): self.ctype = type_name self.type_name = type_name self.get_type = get_type + self.error_quark = None def __repr__(self): return 'GlibEnum(%r, %r, %r)' % (self.name, self.members, diff --git a/giscanner/glibtransformer.py b/giscanner/glibtransformer.py index f4f5382a..02b2767e 100644 --- a/giscanner/glibtransformer.py +++ b/giscanner/glibtransformer.py @@ -90,6 +90,7 @@ class GLibTransformer(object): self._uscore_type_names = {} self._binary = None self._get_type_functions = [] + self._error_quark_functions = [] self._gtype_data = {} self._failed_types = {} self._boxed_types = {} @@ -150,7 +151,7 @@ class GLibTransformer(object): self._pair_class_record(node) for (ns, alias) in self._names.aliases.itervalues(): self._resolve_alias(alias) - + self._resolve_quarks() self._print_statistics() # Fourth pass: ensure all types are known if not self._noclosure: @@ -202,6 +203,13 @@ class GLibTransformer(object): no_uscore_prefixed = (prefix + '_' + to_underscores(suffix)).lower() self._uscore_type_names[no_uscore_prefixed] = node + def _resolve_quarks(self): + for node in self._error_quark_functions: + short = node.symbol[:-len('_quark')] + enum = self._uscore_type_names.get(short) + if enum is not None: + enum.error_quark = node.symbol + # Helper functions def _resolve_gtypename(self, gtype_name): @@ -214,6 +222,7 @@ class GLibTransformer(object): def _execute_binary(self): in_path = os.path.join(self._binary.tmpdir, 'types.txt') f = open(in_path, 'w') + # TODO: Introspect GQuark functions for func in self._get_type_functions: f.write(func) f.write('\n') @@ -304,6 +313,8 @@ class GLibTransformer(object): return if self._parse_get_type_function(func): return + if self._parse_error_quark_function(func): + return self._add_attribute(func) @@ -328,6 +339,18 @@ class GLibTransformer(object): self._get_type_functions.append(symbol) return True + def _parse_error_quark_function(self, func): + if not func.symbol.endswith('_error_quark'): + return False + if func.parameters: + return False + if func.retval.type.name not in ['GLib.Quark', + 'GQuark']: + return False + + self._error_quark_functions.append(func) + return True + def _name_is_internal_gtype(self, giname): try: node = self._get_attribute(giname) diff --git a/tests/scanner/Makefile.am b/tests/scanner/Makefile.am index 36fb772b..bc291b81 100644 --- a/tests/scanner/Makefile.am +++ b/tests/scanner/Makefile.am @@ -34,8 +34,8 @@ EXPECTEDGIRS = $(GIRS:.gir=-expected.gir) TGIRS = $(GIRS:.gir=.tgir) CHECKTGIRS = $(GIRS:.gir=.tgir.check) EXPECTEDTGIRS = $(GIRS:.gir=-expected.tgir) -CLEANFILES = $(TYPELIBS) $(GIRS) $(TGIRS) -BUILT_SOURCES = $(TYPELIBS) $(GIRS) +CLEANFILES = $(TYPELIBS) $(GIRS) +BUILT_SOURCES = $(TYPELIBS) $(GIRS) $(TGIRS) EXTRA_DIST = $(EXPECTEDGIRS) $(EXPECTEDTGIRS) annotation-1.0.gir: libannotation.la annotation.c annotation.h utility-1.0.gir $(SCANNER_BIN) $(SCANNER_LIBS) Makefile @@ -149,10 +149,13 @@ post-check: $(DEBUG) $(top_builddir)/tools/g-ir-generate --includedir=. --includedir=$(top_builddir)/gir $< -o $@ %.tgir.check: %.tgir - @diff -u -U 10 $(srcdir)/$*-expected.tgir $*.tgir && echo "* $*.tgir" + @diff -u -U 10 $(srcdir)/$*-expected.tgir $*.tgir; \ + if test "$$?" = "0"; then \ + echo "* $*.tgir"; \ + rm -f $*.tgir; \ + fi check-local: pre-check check-local: $(CHECKGIRS) $(CHECKTGIRS) $(TYPELIBS) -CLEANFILES += $(TGIRS) check-local: post-check diff --git a/tests/scanner/foo-1.0-expected.gir b/tests/scanner/foo-1.0-expected.gir index 11a3b4e0..d826a5d4 100644 --- a/tests/scanner/foo-1.0-expected.gir +++ b/tests/scanner/foo-1.0-expected.gir @@ -617,6 +617,24 @@ and/or use gtk-doc annotations. --> </parameter> </parameters> </function> + <enumeration name="Error" + glib:type-name="FooError" + glib:get-type="foo_error_get_type" + c:type="FooError" + glib:error-quark="foo_error_quark"> + <member name="good" + value="0" + c:identifier="FOO_ERROR_GOOD" + glib:nick="good"/> + <member name="bad" + value="1" + c:identifier="FOO_ERROR_BAD" + glib:nick="bad"/> + <member name="ugly" + value="2" + c:identifier="FOO_ERROR_UGLY" + glib:nick="ugly"/> + </enumeration> <constant name="SUCCESS_INT" value="4408"> <type name="int"/> </constant> diff --git a/tests/scanner/foo-1.0-expected.tgir b/tests/scanner/foo-1.0-expected.tgir index 59549192..614f6f84 100644 --- a/tests/scanner/foo-1.0-expected.tgir +++ b/tests/scanner/foo-1.0-expected.tgir @@ -485,6 +485,11 @@ </parameter> </parameters> </function> + <enumeration name="Error" glib:type-name="FooError" glib:get-type="foo_error_get_type"> + <member name="good" value="0"/> + <member name="bad" value="1"/> + <member name="ugly" value="2"/> + </enumeration> <constant name="SUCCESS_INT" value="4408"> <type name="int"/> </constant> diff --git a/tests/scanner/foo.c b/tests/scanner/foo.c index 50b78c20..ea55e9d8 100644 --- a/tests/scanner/foo.c +++ b/tests/scanner/foo.c @@ -433,3 +433,25 @@ foo_hidden_get_type (void) return our_type; } +GType +foo_error_get_type (void) +{ + static GType etype = 0; + if (G_UNLIKELY(etype == 0)) { + static const GEnumValue values[] = { + { FOO_ERROR_GOOD, "FOO_ERROR_GOOD", "good" }, + { FOO_ERROR_BAD, "FOO_ERROR_BAD", "bad" }, + { FOO_ERROR_UGLY, "FOO_ERROR_UGLY", "ugly" }, + { 0, NULL, NULL } + }; + etype = g_enum_register_static (g_intern_static_string ("FooError"), values); + } + return etype; +} + +GQuark +foo_error_quark (void) +{ + return g_quark_from_static_string ("foo-error-quark"); +} + diff --git a/tests/scanner/foo.h b/tests/scanner/foo.h index f08fc3c7..b3614f35 100644 --- a/tests/scanner/foo.h +++ b/tests/scanner/foo.h @@ -293,4 +293,13 @@ const FooStruct * foo_test_const_struct_retval (void); void foo_test_const_char_param (const char * param); void foo_test_const_struct_param (const FooStruct * param); +typedef enum { + FOO_ERROR_GOOD, + FOO_ERROR_BAD, + FOO_ERROR_UGLY +} FooError; +GType foo_error_get_type (void); + +GQuark foo_error_quark (void); + #endif /* __FOO_OBJECT_H__ */ |