summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiovanni Campagna <gcampagna@src.gnome.org>2012-06-18 19:10:50 +0200
committerGiovanni Campagna <gcampagna@src.gnome.org>2012-06-18 23:07:50 +0200
commit64f3832893080f8faf476fdf730c51a52beb5dfa (patch)
treedb7cdbb992bfc63b222a813d5020bd488be5d684
parent981f0111c39725cf9b25c50d5b130b14f47dd8dd (diff)
downloadgobject-introspection-64f3832893080f8faf476fdf730c51a52beb5dfa.tar.gz
scanner: complete the enum-to-error-quark fix
Turns out that the problem was not only in the wrong matching to GType enums, but also that the non-GType heuristics used to_underscores instead of to_underscores_noprefix, turning DBusError into D_Bus_Error instead of DBus_Error. Complete with various tests. https://bugzilla.gnome.org/show_bug.cgi?id=669350
-rw-r--r--giscanner/maintransformer.py2
-rw-r--r--giscanner/utils.py5
-rw-r--r--tests/scanner/Regress-1.0-expected.gir123
-rw-r--r--tests/scanner/regress.c84
-rw-r--r--tests/scanner/regress.h62
5 files changed, 274 insertions, 2 deletions
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py
index 850d2424..355158b7 100644
--- a/giscanner/maintransformer.py
+++ b/giscanner/maintransformer.py
@@ -901,7 +901,7 @@ the ones that failed to resolve removed."""
if not isinstance(enum, ast.Enum):
continue
type_name = enum.ctype
- uscored = to_underscores(type_name).lower()
+ uscored = to_underscores_noprefix(type_name).lower()
uscore_enums[uscored] = enum
diff --git a/giscanner/utils.py b/giscanner/utils.py
index 2263b8cd..642da362 100644
--- a/giscanner/utils.py
+++ b/giscanner/utils.py
@@ -52,7 +52,10 @@ _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 variables.
+ In particular, and differently from to_underscores_noprefix(),
+ this function treats the first character differently if it is
+ uppercase and followed by another uppercase letter."""
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)
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index e774948b..3f2b6ddf 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -32,6 +32,13 @@ and/or use gtk-doc annotations. -->
<doc xml:whitespace="preserve">Typedef'd va_list for additional reasons</doc>
<type name="va_list" c:type="va_list"/>
</alias>
+ <enumeration name="ATestError"
+ c:type="RegressATestError"
+ glib:error-domain="regress-atest-error">
+ <member name="code0" value="0" c:identifier="REGRESS_ATEST_ERROR_CODE0"/>
+ <member name="code1" value="1" c:identifier="REGRESS_ATEST_ERROR_CODE1"/>
+ <member name="code2" value="2" c:identifier="REGRESS_ATEST_ERROR_CODE2"/>
+ </enumeration>
<constant name="DOUBLE_CONSTANT"
value="44.220000"
c:type="REGRESS_DOUBLE_CONSTANT">
@@ -70,6 +77,29 @@ use it should be.</doc>
<type name="gdouble" c:type="double"/>
</field>
</record>
+ <enumeration name="TestABCError"
+ glib:type-name="RegressTestABCError"
+ glib:get-type="regress_test_abc_error_get_type"
+ c:type="RegressTestABCError"
+ glib:error-domain="regress-test-abc-error">
+ <member name="code1"
+ value="1"
+ c:identifier="REGRESS_TEST_ABC_ERROR_CODE1"
+ glib:nick="code1"/>
+ <member name="code2"
+ value="2"
+ c:identifier="REGRESS_TEST_ABC_ERROR_CODE2"
+ glib:nick="code2"/>
+ <member name="code3"
+ value="3"
+ c:identifier="REGRESS_TEST_ABC_ERROR_CODE3"
+ glib:nick="code3"/>
+ <function name="quark" c:identifier="regress_test_abc_error_quark">
+ <return-value transfer-ownership="none">
+ <type name="GLib.Quark" c:type="GQuark"/>
+ </return-value>
+ </function>
+ </enumeration>
<record name="TestBoxed"
c:type="RegressTestBoxed"
glib:type-name="RegressTestBoxed"
@@ -286,6 +316,19 @@ use it should be.</doc>
</parameter>
</parameters>
</callback>
+ <enumeration name="TestDEFError"
+ c:type="RegressTestDEFError"
+ glib:error-domain="regress-test-def-error">
+ <member name="code0"
+ value="0"
+ c:identifier="REGRESS_TEST_DEF_ERROR_CODE0"/>
+ <member name="code1"
+ value="1"
+ c:identifier="REGRESS_TEST_DEF_ERROR_CODE1"/>
+ <member name="code2"
+ value="2"
+ c:identifier="REGRESS_TEST_DEF_ERROR_CODE2"/>
+ </enumeration>
<enumeration name="TestEnum"
glib:type-name="RegressTestEnum"
glib:get-type="regress_test_enum_get_type"
@@ -335,6 +378,29 @@ use it should be.</doc>
c:identifier="REGRESS_TEST_UNSIGNED_VALUE2"
glib:nick="value2"/>
</enumeration>
+ <enumeration name="TestError"
+ glib:type-name="RegressTestError"
+ glib:get-type="regress_test_error_get_type"
+ c:type="RegressTestError"
+ glib:error-domain="regress-test-error">
+ <member name="code1"
+ value="1"
+ c:identifier="REGRESS_TEST_ERROR_CODE1"
+ glib:nick="code1"/>
+ <member name="code2"
+ value="2"
+ c:identifier="REGRESS_TEST_ERROR_CODE2"
+ glib:nick="code2"/>
+ <member name="code3"
+ value="3"
+ c:identifier="REGRESS_TEST_ERROR_CODE3"
+ glib:nick="code3"/>
+ <function name="quark" c:identifier="regress_test_error_quark">
+ <return-value transfer-ownership="none">
+ <type name="GLib.Quark" c:type="GQuark"/>
+ </return-value>
+ </function>
+ </enumeration>
<bitfield name="TestFlags"
glib:type-name="RegressTestFlags"
glib:get-type="regress_test_flags_get_type"
@@ -1213,6 +1279,30 @@ Use with regress_test_obj_emit_sig_with_obj</doc>
</callback>
</field>
</record>
+ <enumeration name="TestOtherError"
+ glib:type-name="RegressTestOtherError"
+ glib:get-type="regress_test_unconventional_error_get_type"
+ c:type="RegressTestOtherError"
+ glib:error-domain="regress-test-other-error">
+ <member name="code1"
+ value="1"
+ c:identifier="REGRESS_TEST_OTHER_ERROR_CODE1"
+ glib:nick="code1"/>
+ <member name="code2"
+ value="2"
+ c:identifier="REGRESS_TEST_OTHER_ERROR_CODE2"
+ glib:nick="code2"/>
+ <member name="code3"
+ value="3"
+ c:identifier="REGRESS_TEST_OTHER_ERROR_CODE3"
+ glib:nick="code3"/>
+ <function name="quark"
+ c:identifier="regress_test_unconventional_error_quark">
+ <return-value transfer-ownership="none">
+ <type name="GLib.Quark" c:type="GQuark"/>
+ </return-value>
+ </function>
+ </enumeration>
<bitfield name="TestPrivateEnum" c:type="RegressTestPrivateEnum">
<member name="public_enum_before"
value="1"
@@ -1542,6 +1632,12 @@ Use with regress_test_obj_emit_sig_with_obj</doc>
</parameter>
</parameters>
</function>
+ <function name="atest_error_quark"
+ c:identifier="regress_atest_error_quark">
+ <return-value transfer-ownership="none">
+ <type name="GLib.Quark" c:type="GQuark"/>
+ </return-value>
+ </function>
<function name="func_obj_null_in" c:identifier="regress_func_obj_null_in">
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
@@ -1640,6 +1736,13 @@ libgnome-keyring.</doc>
</parameter>
</parameters>
</function>
+ <function name="test_abc_error_quark"
+ c:identifier="regress_test_abc_error_quark"
+ moved-to="TestABCError.quark">
+ <return-value transfer-ownership="none">
+ <type name="GLib.Quark" c:type="GQuark"/>
+ </return-value>
+ </function>
<function name="test_array_callback"
c:identifier="regress_test_array_callback">
<return-value transfer-ownership="none">
@@ -2175,6 +2278,12 @@ call and can be released on return.</doc>
<type name="GObject.Value" c:type="GValue*"/>
</return-value>
</function>
+ <function name="test_def_error_quark"
+ c:identifier="regress_test_def_error_quark">
+ <return-value transfer-ownership="none">
+ <type name="GLib.Quark" c:type="GQuark"/>
+ </return-value>
+ </function>
<function name="test_double" c:identifier="regress_test_double">
<return-value transfer-ownership="none">
<type name="gdouble" c:type="gdouble"/>
@@ -2197,6 +2306,13 @@ call and can be released on return.</doc>
</parameter>
</parameters>
</function>
+ <function name="test_error_quark"
+ c:identifier="regress_test_error_quark"
+ moved-to="TestError.quark">
+ <return-value transfer-ownership="none">
+ <type name="GLib.Quark" c:type="GQuark"/>
+ </return-value>
+ </function>
<function name="test_filename_return"
c:identifier="regress_test_filename_return">
<return-value transfer-ownership="full">
@@ -3133,6 +3249,13 @@ What we're testing here is that the scanner ignores the @a nested inside XML.</d
</parameter>
</parameters>
</function>
+ <function name="test_unconventional_error_quark"
+ c:identifier="regress_test_unconventional_error_quark"
+ moved-to="TestOtherError.quark">
+ <return-value transfer-ownership="none">
+ <type name="GLib.Quark" c:type="GQuark"/>
+ </return-value>
+ </function>
<function name="test_unichar" c:identifier="regress_test_unichar">
<return-value transfer-ownership="none">
<type name="gunichar" c:type="gunichar"/>
diff --git a/tests/scanner/regress.c b/tests/scanner/regress.c
index 13b18887..6ba2bdf1 100644
--- a/tests/scanner/regress.c
+++ b/tests/scanner/regress.c
@@ -1572,6 +1572,90 @@ regress_global_get_flags_out (RegressTestFlags *v)
*v = REGRESS_TEST_FLAG1 | REGRESS_TEST_FLAG3;
}
+/* error domains */
+
+GType
+regress_test_error_get_type (void)
+{
+ static GType etype = 0;
+ if (G_UNLIKELY(etype == 0)) {
+ static const GEnumValue values[] = {
+ { REGRESS_TEST_ERROR_CODE1, "REGRESS_TEST_ERROR_CODE1", "code1" },
+ { REGRESS_TEST_ERROR_CODE2, "REGRESS_TEST_ERROR_CODE2", "code2" },
+ { REGRESS_TEST_ERROR_CODE3, "REGRESS_TEST_ERROR_CODE3", "code3" },
+ { 0, NULL, NULL }
+ };
+ etype = g_enum_register_static (g_intern_static_string ("RegressTestError"), values);
+ }
+
+ return etype;
+}
+
+GQuark
+regress_test_error_quark (void)
+{
+ return g_quark_from_static_string ("regress-test-error");
+}
+
+GType
+regress_test_abc_error_get_type (void)
+{
+ static GType etype = 0;
+ if (G_UNLIKELY(etype == 0)) {
+ static const GEnumValue values[] = {
+ { REGRESS_TEST_ABC_ERROR_CODE1, "REGRESS_TEST_ABC_ERROR_CODE1", "code1" },
+ { REGRESS_TEST_ABC_ERROR_CODE2, "REGRESS_TEST_ABC_ERROR_CODE2", "code2" },
+ { REGRESS_TEST_ABC_ERROR_CODE3, "REGRESS_TEST_ABC_ERROR_CODE3", "code3" },
+ { 0, NULL, NULL }
+ };
+ etype = g_enum_register_static (g_intern_static_string ("RegressTestABCError"), values);
+ }
+
+ return etype;
+}
+
+GQuark
+regress_test_abc_error_quark (void)
+{
+ return g_quark_from_static_string ("regress-test-abc-error");
+}
+
+GType
+regress_test_unconventional_error_get_type (void)
+{
+ static GType etype = 0;
+ if (G_UNLIKELY(etype == 0)) {
+ static const GEnumValue values[] = {
+ { REGRESS_TEST_OTHER_ERROR_CODE1, "REGRESS_TEST_OTHER_ERROR_CODE1", "code1" },
+ { REGRESS_TEST_OTHER_ERROR_CODE2, "REGRESS_TEST_OTHER_ERROR_CODE2", "code2" },
+ { REGRESS_TEST_OTHER_ERROR_CODE3, "REGRESS_TEST_OTHER_ERROR_CODE3", "code3" },
+ { 0, NULL, NULL }
+ };
+ etype = g_enum_register_static (g_intern_static_string ("RegressTestOtherError"), values);
+ }
+
+ return etype;
+}
+
+GQuark
+regress_test_unconventional_error_quark (void)
+{
+ return g_quark_from_static_string ("regress-test-other-error");
+}
+
+
+GQuark
+regress_test_def_error_quark (void)
+{
+ return g_quark_from_static_string ("regress-test-def-error");
+}
+
+GQuark
+regress_atest_error_quark (void)
+{
+ return g_quark_from_static_string ("regress-atest-error");
+}
+
/* structures */
/**
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index 4d47430f..13916374 100644
--- a/tests/scanner/regress.h
+++ b/tests/scanner/regress.h
@@ -188,6 +188,68 @@ const gchar * regress_test_unsigned_enum_param(RegressTestEnumUnsigned e);
void regress_global_get_flags_out (RegressTestFlags *v);
+/* error domains */
+
+typedef enum
+{
+ REGRESS_TEST_ERROR_CODE1 = 1,
+ REGRESS_TEST_ERROR_CODE2 = 2,
+ REGRESS_TEST_ERROR_CODE3 = 3
+} RegressTestError;
+
+GType regress_test_error_get_type (void);
+GQuark regress_test_error_quark (void);
+
+/* Test weird names, with and without
+ c_symbol_prefix given by a GType
+*/
+typedef enum
+{
+ REGRESS_TEST_ABC_ERROR_CODE1 = 1,
+ REGRESS_TEST_ABC_ERROR_CODE2 = 2,
+ REGRESS_TEST_ABC_ERROR_CODE3 = 3
+} RegressTestABCError;
+
+GType regress_test_abc_error_get_type (void);
+GQuark regress_test_abc_error_quark (void);
+
+typedef enum
+{
+ REGRESS_TEST_OTHER_ERROR_CODE1 = 1,
+ REGRESS_TEST_OTHER_ERROR_CODE2 = 2,
+ REGRESS_TEST_OTHER_ERROR_CODE3 = 3
+} RegressTestOtherError;
+
+/* This returns a GType for RegressTestOtherError.
+ The difference is intentional, although it
+ is mainly meant for capitalization problems.
+*/
+GType regress_test_unconventional_error_get_type (void);
+GQuark regress_test_unconventional_error_quark (void);
+
+typedef enum
+{
+ REGRESS_TEST_DEF_ERROR_CODE0 = 0,
+ REGRESS_TEST_DEF_ERROR_CODE1 = 1,
+ REGRESS_TEST_DEF_ERROR_CODE2 = 2
+} RegressTestDEFError;
+
+GQuark regress_test_def_error_quark (void);
+
+/* the scanner used to have problem
+ with two uppercase letter right after
+ the identifier prefix, that's why
+ we break the RegressTest convention */
+typedef enum
+{
+ REGRESS_ATEST_ERROR_CODE0 = 0,
+ REGRESS_ATEST_ERROR_CODE1 = 1,
+ REGRESS_ATEST_ERROR_CODE2 = 2
+} RegressATestError;
+
+GQuark regress_atest_error_quark (void);
+
+
/* constants */
#define REGRESS_INT_CONSTANT 4422