]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Allow direct access to the integer constants of an error-domain f48208b4cab9f5a7da469067c4cae096082c39ba
authorRico Tzschichholz <ricotz@ubuntu.com>
Sat, 12 Jan 2019 14:20:34 +0000 (15:20 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 12 Jan 2019 14:37:09 +0000 (15:37 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/732

tests/Makefile.am
tests/errors/errorcode.vala [new file with mode: 0644]
vala/valaerrorcode.vala
vala/valamemberaccess.vala

index 3594ebe3e055a59924fc17b835dadfa8a018a809..9ad4e4061982d5614146ba9ff22fb08e38ca5b04 100644 (file)
@@ -363,6 +363,7 @@ TESTS = \
        objects/bug795521.vala \
        errors/catch-error-code.vala \
        errors/errors.vala \
+       errors/errorcode.vala \
        errors/errordomain.vala \
        errors/invalid-type-check.test \
        errors/method-throws.vala \
diff --git a/tests/errors/errorcode.vala b/tests/errors/errorcode.vala
new file mode 100644 (file)
index 0000000..2cb96ec
--- /dev/null
@@ -0,0 +1,32 @@
+errordomain FooError {
+       REALLY_BAD,
+       NOT_SO_GOOD,
+       EVEN_WORSE = 23
+}
+
+void main () {
+       {
+               var error = new IOError.NO_SPACE ("foo");
+               assert (error.code == 12);
+       }
+       {
+               var code = IOError.NO_SPACE;
+               assert (code == 12);
+       }
+       {
+               var error = new FooError.NOT_SO_GOOD ("foo");
+               assert (error.code == 1);
+       }
+       {
+               var code = FooError.NOT_SO_GOOD;
+               assert (code == 1);
+       }
+       {
+               var error = new FooError.EVEN_WORSE ("foo");
+               assert (error.code == 23);
+       }
+       {
+               var code = FooError.EVEN_WORSE;
+               assert (code == 23);
+       }
+}
index ef5f36410cc6235b4213bfacc5c8af6532e1e1e5..3e3c57b3758d39569db847f96aa81c97596ff3f4 100644 (file)
@@ -39,7 +39,23 @@ public class Vala.ErrorCode : TypeSymbol {
                }
        }
 
+       /**
+        * Refers to the enum value of this error code for direct access.
+        */
+       public Constant code {
+               get {
+                       return _code;
+               }
+               private set {
+                       _code = value;
+                       if (_code != null) {
+                               _code.owner = owner;
+                       }
+               }
+       }
+
        private Expression _value;
+       private Constant _code;
 
        /**
         * Creates a new enum value.
@@ -84,6 +100,10 @@ public class Vala.ErrorCode : TypeSymbol {
                        value.check (context);
                }
 
+               code = new Constant (name, context.analyzer.int_type.copy (), null, source_reference, comment);
+               code.external = true;
+               code.check (context);
+
                return !error;
        }
 }
index 09faed946f94b46cf57810527d9474a49a67ec4b..4b131ae4769e38268239572d57c41f8beefbaedb 100644 (file)
@@ -703,6 +703,9 @@ public class Vala.MemberAccess : Expression {
                } else if (member is Signal) {
                        instance = true;
                        access = member.access;
+               } else if (!creation_member && member is ErrorCode) {
+                       symbol_reference = ((ErrorCode) member).code;
+                       member = symbol_reference;
                }
 
                member.used = true;