[vala/0.40] girparser: Create correct output in get_default_lower_case_suffix()
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.40] girparser: Create correct output in get_default_lower_case_suffix()
- Date: Tue, 9 Apr 2019 13:50:32 +0000 (UTC)
commit 103cecce0cf4cf810d6eb729c11cd3e1a7cd6aa6
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 1cf0206f7..f993126e0 100644
--- a/codegen/valaccodeattribute.vala
+++ b/codegen/valaccodeattribute.vala
@@ -825,6 +825,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 a34001857..bb624636e 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -454,6 +454,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 a2a9ee218..594548aea 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]