[vala/0.44] girparser: Create correct output in get_default_lower_case_suffix()



commit 6e87e23719f5671fcf9801304a7f591c1401e2b4
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Thu Mar 28 00:02:59 2019 +0100

    girparser: Create correct output in get_default_lower_case_suffix()
    
    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    |  1 +
 tests/Makefile.am                  |  1 +
 tests/gir/symbol-type-csuffix.test | 26 ++++++++++++++++++++++++++
 vala/valagirparser.vala            | 20 ++++++++++++++++++--
 4 files changed, 46 insertions(+), 2 deletions(-)
---
diff --git a/codegen/valaccodeattribute.vala b/codegen/valaccodeattribute.vala
index 5615eb618..5728fb469 100644
--- a/codegen/valaccodeattribute.vala
+++ b/codegen/valaccodeattribute.vala
@@ -890,6 +890,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);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 07bd8e28f..03745069b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -501,6 +501,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
index 000000000..8039d4a8c
--- /dev/null
+++ b/tests/gir/symbol-type-csuffix.test
@@ -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 ();
+}
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 0210f6fde..f95c425bf 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -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 () {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]