]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
girwriter: Evaluate and output non literal enum-value if it is a simple constant wip/issue/996
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 19 May 2020 12:29:06 +0000 (14:29 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 23 May 2020 08:15:53 +0000 (10:15 +0200)
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
tests/girwriter/GirTest-1.0.gir-expected
tests/girwriter/girtest.vala
tests/girwriter/girtest.vapi-expected

index 0198cc908c20411165e38d4795d5c9bc79790d3b..d00824d2965a620233ffb6864ce237eca7118d61 100644 (file)
@@ -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;
        }
index 0db2fc63658fd7b403cbb1a9357eab5c892fdd15..a71242e9df7bea7f0b032fc7877921610ad273ba 100644 (file)
        <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"/>
index e9b3d2ae1f1ab9bace5d5d6545482f9984b807e3..e0756e5fbff88b94e480addb127024704fb062ab 100644 (file)
@@ -306,4 +306,10 @@ namespace GirTest {
                public void method<K> (K[] param) {
                }
        }
+
+       public enum EnumTest2 {
+               VALUE1 = EnumTest.VALUE3,
+               VALUE2,
+               VALUE3 = 4711
+       }
 }
index f92e00d057468ac37211d4825d8a27a1d7f530e2..b2deaad4ea3050ddc98633839acf1e473216912f 100644 (file)
@@ -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,