Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Dahlin <jdahlin@async.com.br>2009-01-22 00:02:49 (GMT)
committer Johan Dahlin <johan@src.gnome.org>2009-01-22 00:02:49 (GMT)
commitf90b158f0563a23213678c8dabfbccc08aaa5fb5 (patch)
tree2c007c16f144af672e3e49b7f19f02fe8c9f9454
parent4aa4dacaffe4ea0fe78ac97d0437d0563e12aacd (diff)
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--ChangeLog13
-rw-r--r--giscanner/girwriter.py3
-rw-r--r--giscanner/glibast.py1
-rw-r--r--giscanner/glibtransformer.py25
-rw-r--r--tests/scanner/Makefile.am11
-rw-r--r--tests/scanner/foo-1.0-expected.gir18
-rw-r--r--tests/scanner/foo-1.0-expected.tgir5
-rw-r--r--tests/scanner/foo.c22
-rw-r--r--tests/scanner/foo.h9
9 files changed, 102 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 46d9a2b..487d143 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 89af8fb..51a208d 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 11a5ed0..f61cd5f 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 f4f5382..02b2767 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 36fb772..bc291b8 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 11a3b4e..d826a5d 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 5954919..614f6f8 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 50b78c2..ea55e9d 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 f08fc3c..b3614f3 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__ */