From d5f6518d6318920be6982b2125acc0f70f2f830f Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Sun, 31 Jan 2021 14:21:19 +0100 Subject: [PATCH] girparser: Set CCode.type_cname for classes if it doesn't match our default --- tests/Makefile.am | 1 + tests/gir/gtype-struct-name.test | 47 ++++++++++++++++++++++++++++++++ vala/valagirparser.vala | 9 ++++-- 3 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 tests/gir/gtype-struct-name.test diff --git a/tests/Makefile.am b/tests/Makefile.am index 0395d0a4e..a5b2ba5ab 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..3ad28cac5 --- /dev/null +++ b/tests/gir/gtype-struct-name.test @@ -0,0 +1,47 @@ +GIR + +Input: + + + + + + + + + + + + + + + + + + + +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 { +} diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala index fa6773f81..836d2436f 100644 --- a/vala/valagirparser.vala +++ b/vala/valagirparser.vala @@ -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; } -- 2.47.3