[vala/wip/issue/996: 5/5] girwriter: Evaluate and output non literal enum-value if it is a simple constant
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/wip/issue/996: 5/5] girwriter: Evaluate and output non literal enum-value if it is a simple constant
- Date: Sat, 23 May 2020 08:16:21 +0000 (UTC)
commit 086cd345e8d3e78901b963a8fdc0c5d74efc3a7a
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Tue May 19 14:29:06 2020 +0200
girwriter: Evaluate and output non literal enum-value if it is a simple constant
This avoids the output of "(null)" in the generated GIR for these cases.
Fixes https://gitlab.gnome.org/GNOME/vala/issues/996
codegen/valagirwriter.vala | 13 +++++++++----
tests/girwriter/GirTest-1.0.gir-expected | 5 +++++
tests/girwriter/girtest.vala | 6 ++++++
tests/girwriter/girtest.vapi-expected | 6 ++++++
4 files changed, 26 insertions(+), 4 deletions(-)
---
diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala
index 0198cc908..d00824d29 100644
--- a/codegen/valagirwriter.vala
+++ b/codegen/valagirwriter.vala
@@ -823,7 +823,7 @@ public class Vala.GIRWriter : CodeVisitor {
var en = (Enum) hierarchy[0];
buffer.append_printf ("<member name=\"%s\" c:identifier=\"%s\"", ev.name.down (),
get_ccode_name (ev));
if (ev.value != null) {
- string value = literal_expression_to_value_string (ev.value);
+ string? value = literal_expression_to_value_string (ev.value);
buffer.append_printf (" value=\"%s\"", value);
} else {
if (en.is_flags) {
@@ -884,7 +884,7 @@ public class Vala.GIRWriter : CodeVisitor {
write_indent ();
buffer.append_printf ("<member name=\"%s\" c:identifier=\"%s\"", ecode.name.down (),
get_ccode_name (ecode));
if (ecode.value != null) {
- string value = literal_expression_to_value_string (ecode.value);
+ string? value = literal_expression_to_value_string (ecode.value);
buffer.append_printf (" value=\"%s\"", value);
} else {
buffer.append_printf (" value=\"%d\"", enum_value++);
@@ -917,7 +917,7 @@ public class Vala.GIRWriter : CodeVisitor {
//TODO Add better constant evaluation
var initializer = c.value;
- string value = literal_expression_to_value_string (initializer);
+ string? value = literal_expression_to_value_string (initializer, false);
write_indent ();
buffer.append_printf ("<constant name=\"%s\" c:identifier=\"%s\"", c.name, get_ccode_name
(c));
@@ -1657,7 +1657,7 @@ public class Vala.GIRWriter : CodeVisitor {
return get_full_gir_name (type_symbol);
}
- private string? literal_expression_to_value_string (Expression literal) {
+ private string? literal_expression_to_value_string (Expression literal, bool cvalue_fallback = true) {
if (literal is StringLiteral) {
var lit = literal as StringLiteral;
if (lit != null) {
@@ -1680,6 +1680,11 @@ public class Vala.GIRWriter : CodeVisitor {
return "-" + ((IntegerLiteral) unary.inner).value;
}
}
+ } else if (cvalue_fallback) {
+ unowned CCodeExpression? cexpr = get_cvalue (literal);
+ if (cexpr is CCodeConstant) {
+ return ((CCodeConstant) cexpr).name;
+ }
}
return null;
}
diff --git a/tests/girwriter/GirTest-1.0.gir-expected b/tests/girwriter/GirTest-1.0.gir-expected
index 0db2fc636..a71242e9d 100644
--- a/tests/girwriter/GirTest-1.0.gir-expected
+++ b/tests/girwriter/GirTest-1.0.gir-expected
@@ -26,6 +26,11 @@
<enumeration name="SkippedFlags" c:type="GirTestSkippedFlags" glib:type-name="GirTestSkippedFlags"
glib:get-type="gir_test_skipped_flags_get_type" introspectable="0">
<member name="value1" c:identifier="GIR_TEST_SKIPPED_FLAGS_VALUE1" value="0"/>
</enumeration>
+ <enumeration name="EnumTest2" c:type="GirTestEnumTest2" glib:type-name="GirTestEnumTest2"
glib:get-type="gir_test_enum_test2_get_type">
+ <member name="value1" c:identifier="GIR_TEST_ENUM_TEST2_VALUE1"
value="GIR_TEST_ENUM_TEST_VALUE3"/>
+ <member name="value2" c:identifier="GIR_TEST_ENUM_TEST2_VALUE2" value="0"/>
+ <member name="value3" c:identifier="GIR_TEST_ENUM_TEST2_VALUE3" value="4711"/>
+ </enumeration>
<enumeration name="ErrorTest" c:type="GirTestErrorTest" glib:error-domain="gir-test-error-test-quark">
<member name="failed" c:identifier="GIR_TEST_ERROR_TEST_FAILED" value="0"/>
<member name="smelly" c:identifier="GIR_TEST_ERROR_TEST_SMELLY" value="1"/>
diff --git a/tests/girwriter/girtest.vala b/tests/girwriter/girtest.vala
index e9b3d2ae1..e0756e5fb 100644
--- a/tests/girwriter/girtest.vala
+++ b/tests/girwriter/girtest.vala
@@ -306,4 +306,10 @@ namespace GirTest {
public void method<K> (K[] param) {
}
}
+
+ public enum EnumTest2 {
+ VALUE1 = EnumTest.VALUE3,
+ VALUE2,
+ VALUE3 = 4711
+ }
}
diff --git a/tests/girwriter/girtest.vapi-expected b/tests/girwriter/girtest.vapi-expected
index f92e00d05..b2deaad4e 100644
--- a/tests/girwriter/girtest.vapi-expected
+++ b/tests/girwriter/girtest.vapi-expected
@@ -143,6 +143,12 @@ namespace GirTest {
VALUE3
}
[CCode (cheader_filename = "girtest.h")]
+ public enum EnumTest2 {
+ VALUE1,
+ VALUE2,
+ VALUE3
+ }
+ [CCode (cheader_filename = "girtest.h")]
[Flags]
public enum FlagsTest {
VALUE1,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]