diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-04-28 17:52:40 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-04-29 08:50:00 +0200 |
commit | 5284e6bda7582cdd011e6fce545c02ae3dd4f3bb (patch) | |
tree | 46c00070a201ffddefba699e4eb2092facfbbd6f | |
parent | 153b8355f3fd8f1106ee2ed74a82d4f2ef8738e2 (diff) | |
download | vala-5284e6bda7582cdd011e6fce545c02ae3dd4f3bb.tar.gz |
girwriter: Properly write attributes for non-GObject classes
-rw-r--r-- | codegen/valagirwriter.vala | 40 | ||||
-rw-r--r-- | tests/girwriter/GirTest-1.0.gir-expected | 70 | ||||
-rw-r--r-- | tests/girwriter/girtest.vala | 3 | ||||
-rw-r--r-- | tests/girwriter/girtest.vapi-expected | 4 |
4 files changed, 110 insertions, 7 deletions
diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala index c125f5467..4cc2e587a 100644 --- a/codegen/valagirwriter.vala +++ b/codegen/valagirwriter.vala @@ -112,6 +112,8 @@ public class Vala.GIRWriter : CodeVisitor { private TypeSymbol gobject_type; private TypeSymbol ginitiallyunowned_type; private TypeSymbol gtypeinterface_type; + private TypeSymbol gtypeinstance_type; + private TypeSymbol gtype_type; private struct GIRNamespace { public GIRNamespace (string ns, string version) { @@ -155,6 +157,8 @@ public class Vala.GIRWriter : CodeVisitor { gobject_type = (TypeSymbol) glib_ns.scope.lookup ("Object"); ginitiallyunowned_type = (TypeSymbol) glib_ns.scope.lookup ("InitiallyUnowned"); gtypeinterface_type = (TypeSymbol) glib_ns.scope.lookup ("TypeInterface"); + gtypeinstance_type = (TypeSymbol) glib_ns.scope.lookup ("TypeInstance"); + gtype_type = (TypeSymbol) glib_ns.scope.lookup ("Type"); write_package (package); @@ -322,14 +326,22 @@ public class Vala.GIRWriter : CodeVisitor { return; } - if (cl.is_subtype_of (gobject_type)) { + if (!cl.is_compact) { string gtype_struct_name = get_gir_name (cl) + "Class"; write_indent (); buffer.append_printf ("<class name=\"%s\"", get_gir_name (cl)); write_gtype_attributes (cl); buffer.append_printf (" glib:type-struct=\"%s\"", gtype_struct_name); - buffer.append_printf (" parent=\"%s\"", gi_type_name (cl.base_class)); + if (cl.base_class == null) { + buffer.append_printf (" glib:fundamental=\"1\""); + buffer.append_printf (" glib:ref-func=\"%s\"", get_ccode_ref_function (cl)); + buffer.append_printf (" glib:unref-func=\"%s\"", get_ccode_unref_function (cl)); + buffer.append_printf (" glib:set-value-func=\"%s\"", get_ccode_set_value_function (cl)); + buffer.append_printf (" glib:get-value-func=\"%s\"", get_ccode_get_value_function (cl)); + } else { + buffer.append_printf (" parent=\"%s\"", gi_type_name (cl.base_class)); + } if (cl.is_abstract) { buffer.append_printf (" abstract=\"1\""); } @@ -352,11 +364,26 @@ public class Vala.GIRWriter : CodeVisitor { buffer.append_printf ("<field name=\"parent_instance\">\n"); indent++; write_indent (); - buffer.append_printf ("<type name=\"%s\" c:type=\"%s\"/>\n", gi_type_name (cl.base_class), get_ccode_name (cl.base_class)); + if (cl.base_class == null) { + buffer.append_printf ("<type name=\"%s\" c:type=\"%s\"/>\n", gi_type_name (gtypeinstance_type), get_ccode_name (gtypeinstance_type)); + } else { + buffer.append_printf ("<type name=\"%s\" c:type=\"%s\"/>\n", gi_type_name (cl.base_class), get_ccode_name (cl.base_class)); + } indent--; write_indent (); buffer.append_printf("</field>\n"); + if (cl.base_class == null) { + write_indent (); + buffer.append_printf ("<field name=\"ref_count\">\n"); + indent++; + write_indent (); + buffer.append_printf ("<type name=\"gint\" c:type=\"volatile int\"/>\n"); + indent--; + write_indent (); + buffer.append_printf("</field>\n"); + } + write_indent (); buffer.append_printf ("<field name=\"priv\">\n"); indent++; @@ -385,7 +412,12 @@ public class Vala.GIRWriter : CodeVisitor { buffer.append_printf ("<field name=\"parent_class\">\n"); indent++; write_indent (); - buffer.append_printf ("<type name=\"%sClass\" c:type=\"%sClass\"/>\n", gi_type_name (cl.base_class), get_ccode_name (cl.base_class)); + if (cl.base_class == null) { + //FIXME GObject.TypeClass vs GType + buffer.append_printf ("<type name=\"%sClass\" c:type=\"%sClass\"/>\n", "GObject.Type", get_ccode_name (gtype_type)); + } else { + buffer.append_printf ("<type name=\"%sClass\" c:type=\"%sClass\"/>\n", gi_type_name (cl.base_class), get_ccode_name (cl.base_class)); + } indent--; write_indent (); buffer.append_printf ("</field>\n"); diff --git a/tests/girwriter/GirTest-1.0.gir-expected b/tests/girwriter/GirTest-1.0.gir-expected index 18ae0bbdc..a8bf8181d 100644 --- a/tests/girwriter/GirTest-1.0.gir-expected +++ b/tests/girwriter/GirTest-1.0.gir-expected @@ -31,7 +31,16 @@ <member name="smelly" c:identifier="GIR_TEST_ERROR_TEST_SMELLY" value="1"/> <member name="fishy" c:identifier="GIR_TEST_ERROR_TEST_FISHY" value="23"/> </enumeration> - <record name="TypeTest"> + <class name="TypeTest" c:type="GirTestTypeTest" glib:type-name="GirTestTypeTest" glib:get-type="gir_test_typetest_get_type" glib:type-struct="TypeTestClass" glib:fundamental="1" glib:ref-func="gir_test_typetest_ref" glib:unref-func="gir_test_typetest_unref" glib:set-value-func="gir_test_value_set_typetest" glib:get-value-func="gir_test_value_get_typetest"> + <field name="parent_instance"> + <type name="GObject.TypeInstance" c:type="GTypeInstance"/> + </field> + <field name="ref_count"> + <type name="gint" c:type="volatile int"/> + </field> + <field name="priv"> + <type name="TypeTestPrivate" c:type="GirTestTypeTestPrivate*"/> + </field> <constructor name="new" c:identifier="gir_test_typetest_new"> <return-value transfer-ownership="full"> <type name="GirTest.TypeTest" c:type="GirTestTypeTest*"/> @@ -52,7 +61,32 @@ </parameter> </parameters> </method> + </class> + <record name="TypeTestClass" c:type="GirTestTypeTestClass" glib:is-gtype-struct-for="TypeTest"> + <field name="parent_class"> + <type name="GObject.TypeClass" c:type="GTypeClass"/> + </field> </record> + <record name="TypeTestPrivate" c:type="GirTestTypeTestPrivate" disguised="1"/> + <class name="SubTypeTest" c:type="GirTestSubTypeTest" glib:type-name="GirTestSubTypeTest" glib:get-type="gir_test_sub_type_test_get_type" glib:type-struct="SubTypeTestClass" parent="GirTest.TypeTest"> + <field name="parent_instance"> + <type name="GirTest.TypeTest" c:type="GirTestTypeTest"/> + </field> + <field name="priv"> + <type name="SubTypeTestPrivate" c:type="GirTestSubTypeTestPrivate*"/> + </field> + <constructor name="new" c:identifier="gir_test_sub_type_test_new"> + <return-value transfer-ownership="full"> + <type name="GirTest.SubTypeTest" c:type="GirTestSubTypeTest*"/> + </return-value> + </constructor> + </class> + <record name="SubTypeTestClass" c:type="GirTestSubTypeTestClass" glib:is-gtype-struct-for="SubTypeTest"> + <field name="parent_class"> + <type name="GirTest.TypeTestClass" c:type="GirTestTypeTestClass"/> + </field> + </record> + <record name="SubTypeTestPrivate" c:type="GirTestSubTypeTestPrivate" disguised="1"/> <class name="ObjectTest" c:type="GirTestObjectTest" glib:type-name="GirTestObjectTest" glib:get-type="gir_test_object_test_get_type" glib:type-struct="ObjectTestClass" parent="GObject.Object"> <field name="parent_instance"> <type name="GObject.Object" c:type="GObject"/> @@ -882,20 +916,50 @@ </field> </record> <record name="ImplementionTestPrivate" c:type="GirTestImplementionTestPrivate" disguised="1"/> - <record name="SkippedClass" introspectable="0"> + <class name="SkippedClass" c:type="GirTestSkippedClass" glib:type-name="GirTestSkippedClass" glib:get-type="gir_test_skippedclass_get_type" glib:type-struct="SkippedClassClass" glib:fundamental="1" glib:ref-func="gir_test_skippedclass_ref" glib:unref-func="gir_test_skippedclass_unref" glib:set-value-func="gir_test_value_set_skippedclass" glib:get-value-func="gir_test_value_get_skippedclass" introspectable="0"> + <field name="parent_instance"> + <type name="GObject.TypeInstance" c:type="GTypeInstance"/> + </field> + <field name="ref_count"> + <type name="gint" c:type="volatile int"/> + </field> + <field name="priv"> + <type name="SkippedClassPrivate" c:type="GirTestSkippedClassPrivate*"/> + </field> <constructor name="new" c:identifier="gir_test_skippedclass_new"> <return-value transfer-ownership="full"> <type name="GirTest.SkippedClass" c:type="GirTestSkippedClass*"/> </return-value> </constructor> + </class> + <record name="SkippedClassClass" c:type="GirTestSkippedClassClass" glib:is-gtype-struct-for="SkippedClass"> + <field name="parent_class"> + <type name="GObject.TypeClass" c:type="GTypeClass"/> + </field> </record> - <record name="DeprecatedClassTest" deprecated="1" deprecated-version="0.1.2" version="0.1.0"> + <record name="SkippedClassPrivate" c:type="GirTestSkippedClassPrivate" disguised="1"/> + <class name="DeprecatedClassTest" c:type="GirTestDeprecatedClassTest" glib:type-name="GirTestDeprecatedClassTest" glib:get-type="gir_test_deprecated_class_test_get_type" glib:type-struct="DeprecatedClassTestClass" glib:fundamental="1" glib:ref-func="gir_test_deprecated_class_test_ref" glib:unref-func="gir_test_deprecated_class_test_unref" glib:set-value-func="gir_test_value_set_deprecated_class_test" glib:get-value-func="gir_test_value_get_deprecated_class_test" deprecated="1" deprecated-version="0.1.2" version="0.1.0"> + <field name="parent_instance"> + <type name="GObject.TypeInstance" c:type="GTypeInstance"/> + </field> + <field name="ref_count"> + <type name="gint" c:type="volatile int"/> + </field> + <field name="priv"> + <type name="DeprecatedClassTestPrivate" c:type="GirTestDeprecatedClassTestPrivate*"/> + </field> <constructor name="new" c:identifier="gir_test_deprecated_class_test_new"> <return-value transfer-ownership="full"> <type name="GirTest.DeprecatedClassTest" c:type="GirTestDeprecatedClassTest*"/> </return-value> </constructor> + </class> + <record name="DeprecatedClassTestClass" c:type="GirTestDeprecatedClassTestClass" glib:is-gtype-struct-for="DeprecatedClassTest"> + <field name="parent_class"> + <type name="GObject.TypeClass" c:type="GTypeClass"/> + </field> </record> + <record name="DeprecatedClassTestPrivate" c:type="GirTestDeprecatedClassTestPrivate" disguised="1"/> <interface name="InterfaceTest" c:type="GirTestInterfaceTest" glib:type-name="GirTestInterfaceTest" glib:get-type="gir_test_interface_test_get_type" glib:type-struct="InterfaceTestIface"> <prerequisite name="GObject.Object"/> <method name="int8_in" c:identifier="gir_test_interface_test_int8_in"> diff --git a/tests/girwriter/girtest.vala b/tests/girwriter/girtest.vala index 2e7c522bd..ef35e8ec8 100644 --- a/tests/girwriter/girtest.vala +++ b/tests/girwriter/girtest.vala @@ -86,6 +86,9 @@ namespace GirTest { public string some_property { get; set; } } + public class SubTypeTest : TypeTest { + } + public class ObjectTest : Object { private static ObjectTest global_instance = new ObjectTest (); diff --git a/tests/girwriter/girtest.vapi-expected b/tests/girwriter/girtest.vapi-expected index 0b6e574a7..4a0709bc2 100644 --- a/tests/girwriter/girtest.vapi-expected +++ b/tests/girwriter/girtest.vapi-expected @@ -76,6 +76,10 @@ namespace GirTest { public SkippedClass (); } [CCode (cheader_filename = "girtest.h")] + public class SubTypeTest : GirTest.TypeTest { + public SubTypeTest (); + } + [CCode (cheader_filename = "girtest.h")] public class TypeTest { public TypeTest (); public string some_property { get; set; } |