diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2020-05-19 14:29:06 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2020-05-23 10:15:53 +0200 |
commit | 086cd345e8d3e78901b963a8fdc0c5d74efc3a7a (patch) | |
tree | 7d31fef47282e08b3a8dc7660eba95191d2c0a16 | |
parent | f844ad1c02fb5b17e923a7ba4e69cf2a7df96a14 (diff) | |
download | vala-wip/issue/996.tar.gz |
girwriter: Evaluate and output non literal enum-value if it is a simple constantwip/issue/996
This avoids the output of "(null)" in the generated GIR for these cases.
Fixes https://gitlab.gnome.org/GNOME/vala/issues/996
-rw-r--r-- | codegen/valagirwriter.vala | 13 | ||||
-rw-r--r-- | tests/girwriter/GirTest-1.0.gir-expected | 5 | ||||
-rw-r--r-- | tests/girwriter/girtest.vala | 6 | ||||
-rw-r--r-- | 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, |