]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
girparser: Set CCode.type_cname for classes if it doesn't match our default
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 31 Jan 2021 13:21:19 +0000 (14:21 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 31 Jan 2021 13:21:27 +0000 (14:21 +0100)
tests/Makefile.am
tests/gir/gtype-struct-name.test [new file with mode: 0644]
vala/valagirparser.vala

index 0395d0a4e704ce6962836091bd9df0bc925edf68..a5b2ba5ab919b78b7b73090e09e3e3fc9057680b 100644 (file)
@@ -709,6 +709,7 @@ TESTS = \
        gir/delegate-error-pos.test \
        gir/enum.test \
        gir/errordomain.test \
+       gir/gtype-struct-name.test \
        gir/instance-parameter-owned.test \
        gir/method-array-length-type.test \
        gir/parameter-array-length-type.test \
diff --git a/tests/gir/gtype-struct-name.test b/tests/gir/gtype-struct-name.test
new file mode 100644 (file)
index 0000000..3ad28ca
--- /dev/null
@@ -0,0 +1,47 @@
+GIR
+
+Input:
+
+<interface name="Foo"
+           c:symbol-prefix="foo"
+           c:type="TestFoo"
+           glib:type-name="TestFoo"
+           glib:get-type="test_foo_get_type"
+           glib:type-struct="FooInterface">
+</interface>
+<record name="FooInterface"
+        c:type="TestFooInterface"
+        glib:is-gtype-struct-for="Foo">
+  <field name="parent" readable="0" private="1">
+    <type name="GObject.TypeInterface" c:type="GTypeInterface"/>
+  </field>
+</record>
+<class name="Bar"
+       c:symbol-prefix="bar"
+       c:type="TestBar"
+       parent="GObject.Object"
+       glib:type-name="TestBar"
+       glib:get-type="test_bar_get_type"
+       glib:type-struct="BarKlass">
+  <field name="parent" readable="0" private="1">
+    <type name="GObject.Object" c:type="GObject"/>
+  </field>
+</class>
+<record name="BarKlass"
+        c:type="TestBarKlass"
+        glib:is-gtype-struct-for="Bar">
+  <field name="parent" readable="0" private="1">
+    <type name="GObject.ObjectClass" c:type="GObjectClass"/>
+  </field>
+</record>
+
+Output:
+
+[CCode (cheader_filename = "test.h", type_cname = "TestBarKlass", type_id = "test_bar_get_type ()")]
+public class Bar : GLib.Object {
+       [CCode (has_construct_function = false)]
+       protected Bar ();
+}
+[CCode (cheader_filename = "test.h", type_cname = "TestFooInterface", type_id = "test_foo_get_type ()")]
+public interface Foo : GLib.Object {
+}
index fa6773f81c47e692069d6f4911169eaf2ea45c6c..836d2436f5455bc56eea29a0e4e4b86f13b977d3 100644 (file)
@@ -1215,10 +1215,13 @@ public class Vala.GirParser : CodeVisitor {
                                                // record for a gtype
                                                var gtype_struct_for = girdata["glib:is-gtype-struct-for"];
                                                if (gtype_struct_for != null) {
-                                                       var iface = parser.resolve_node (parent, parser.parse_symbol_from_string (gtype_struct_for, source_reference));
-                                                       if (iface != null && iface.symbol is Interface && "%sIface".printf (iface.get_cname ()) != get_cname ()) {
+                                                       var obj = parser.resolve_node (parent, parser.parse_symbol_from_string (gtype_struct_for, source_reference));
+                                                       if (obj != null && obj.symbol is Interface && "%sIface".printf (obj.get_cname ()) != get_cname ()) {
                                                                // set the interface struct name
-                                                               iface.symbol.set_attribute_string ("CCode", "type_cname", get_cname ());
+                                                               obj.symbol.set_attribute_string ("CCode", "type_cname", get_cname ());
+                                                       } else if (obj != null && obj.symbol is Class && "%sClass".printf (obj.get_cname ()) != get_cname ()) {
+                                                               // set the class struct name
+                                                               obj.symbol.set_attribute_string ("CCode", "type_cname", get_cname ());
                                                        }
                                                        merged = true;
                                                }