]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
girparser: Create correct output in get_default_lower_case_suffix()
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 27 Mar 2019 23:02:59 +0000 (00:02 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 10 Apr 2019 14:26:19 +0000 (16:26 +0200)
It must match the output of CCodeAttribute.get_default_lower_case_suffix()

Add metadata support to set lower_case_csuffix

See https://gitlab.gnome.org/GNOME/vala/issues/778

codegen/valaccodeattribute.vala
tests/Makefile.am
tests/gir/symbol-type-csuffix.test [new file with mode: 0644]
vala/valagirparser.vala

index 93e4c77e991077a49733150b556d54f5d1c1e08b..85f4088b4cab122761bebdb9eae3cb7be3ec37cc 100644 (file)
@@ -840,6 +840,7 @@ public class Vala.CCodeAttribute : AttributeCache {
                if (sym is ObjectTypeSymbol) {
                        var csuffix = Symbol.camel_case_to_lower_case (sym.name);
 
+                       // FIXME Code duplication with GirParser.Node.get_default_lower_case_suffix()
                        // remove underscores in some cases to avoid conflicts of type macros
                        if (csuffix.has_prefix ("type_")) {
                                csuffix = "type" + csuffix.substring ("type_".length);
index b7bbed0f814e2819c3daf4c92395c90a6810790b..0dcc0805d564b95e4ae3a83b0aad2710e1981faf 100644 (file)
@@ -471,6 +471,7 @@ TESTS = \
        gir/parameter-array-length-type.test \
        gir/parameter-nullable-out-simple-type.test \
        gir/property-non-readable.test \
+       gir/symbol-type-csuffix.test \
        annotations/deprecated.vala \
        annotations/description.vala \
        annotations/noaccessormethod.test \
diff --git a/tests/gir/symbol-type-csuffix.test b/tests/gir/symbol-type-csuffix.test
new file mode 100644 (file)
index 0000000..8039d4a
--- /dev/null
@@ -0,0 +1,26 @@
+GIR
+
+Input:
+
+<class name="TypeFoo" c:type="TestTypeFoo" glib:type-name="TestTypeFoo" glib:get-type="test_foo_get_type" glib:type-struct="TypeFooClass" parent="GObject.Object">
+  <constructor name="new" c:identifier="test_type_foo_new">
+    <return-value transfer-ownership="full">
+      <type name="Test.TypeFoo" c:type="TestTypeFoo*"/>
+    </return-value>
+  </constructor>
+  <method name="bar" c:identifier="test_type_foo_bar">
+    <return-value transfer-ownership="none">
+      <type name="none"/>
+    </return-value>
+  </method>
+</class>
+
+Output:
+
+[CCode (cheader_filename = "test.h", type_id = "test_foo_get_type ()")]
+public class TypeFoo : GLib.Object {
+       [CCode (cname = "test_type_foo_new", has_construct_function = false)]
+       public TypeFoo ();
+       [CCode (cname = "test_type_foo_bar")]
+       public void bar ();
+}
index 080f8f735cf808ad90a60f9a57fb420fef39f3f6..6026c038456ba8fc8a64483d486377ca16d1c7de 100644 (file)
@@ -88,7 +88,8 @@ public class Vala.GirParser : CodeVisitor {
                FINISH_VFUNC_NAME,
                NO_ACCESSOR_METHOD,
                CNAME,
-               DELEGATE_TARGET;
+               DELEGATE_TARGET,
+               LOWER_CASE_CSUFFIX;
 
                public static ArgumentType? from_string (string name) {
                        var enum_class = (EnumClass) typeof(ArgumentType).class_ref ();
@@ -698,6 +699,9 @@ public class Vala.GirParser : CodeVisitor {
 
                public string get_lower_case_csuffix () {
                        var suffix = symbol.get_attribute_string ("CCode", "lower_case_csuffix");
+                       if (metadata.has_argument (ArgumentType.LOWER_CASE_CSUFFIX)) {
+                               suffix = metadata.get_string (ArgumentType.LOWER_CASE_CSUFFIX);
+                       }
 
                        // we can't rely on gir suffix if metadata changed the name
                        if (suffix == null && girdata != null && girdata["c:symbol-prefix"] != null && !metadata.has_argument (ArgumentType.NAME)) {
@@ -710,7 +714,19 @@ public class Vala.GirParser : CodeVisitor {
                }
 
                public string get_default_lower_case_csuffix () {
-                       return Symbol.camel_case_to_lower_case (name);
+                       var csuffix = Symbol.camel_case_to_lower_case (name);
+
+                       // FIXME Code duplication with CCodeAttribute.get_default_lower_case_suffix()
+                       // remove underscores in some cases to avoid conflicts of type macros
+                       if (csuffix.has_prefix ("type_")) {
+                               csuffix = "type" + csuffix.substring ("type_".length);
+                       } else if (csuffix.has_prefix ("is_")) {
+                               csuffix = "is" + csuffix.substring ("is_".length);
+                       }
+                       if (csuffix.has_suffix ("_class")) {
+                               csuffix = csuffix.substring (0, csuffix.length - "_class".length) + "class";
+                       }
+                       return csuffix;
                }
 
                public string get_cprefix () {