]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Support static methods in error-domains
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 28 Jul 2019 15:21:25 +0000 (17:21 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 30 Jul 2019 14:20:29 +0000 (16:20 +0200)
Actually generate methods defined inside error-domains and state that
instance methods are not supported yet.

See https://gitlab.gnome.org/GNOME/vala/issues/829

codegen/valagerrormodule.vala
tests/Makefile.am
tests/errors/errordomain-instance-method.test [new file with mode: 0644]
tests/errors/errordomain-static-method.vala [new file with mode: 0644]
vala/valaerrordomain.vala
valadoc/tests/drivers/api-test.data.vapi
valadoc/tests/drivers/generic-api-test.vala

index bae957f02e7322948be6b3702cddabe777b9fa58..2abd5a4cef54dd504da0e0f87ac1c450673074b2 100644 (file)
@@ -59,6 +59,8 @@ public class Vala.GErrorModule : CCodeDelegateModule {
        }
 
        public override void visit_error_domain (ErrorDomain edomain) {
+               edomain.accept_children (this);
+
                if (edomain.comment != null) {
                        cfile.add_type_definition (new CCodeComment (edomain.comment.content));
                }
index f1b9be8fe945161c2a7fa89d69698e47a8faa519..cada29aa2873636a4eae26690edeb92803a22e5b 100644 (file)
@@ -414,6 +414,8 @@ TESTS = \
        errors/errors.vala \
        errors/errorcode.vala \
        errors/errordomain.vala \
+       errors/errordomain-instance-method.test \
+       errors/errordomain-static-method.vala \
        errors/invalid-type-check.test \
        errors/method-throws.vala \
        errors/bug567181.vala \
diff --git a/tests/errors/errordomain-instance-method.test b/tests/errors/errordomain-instance-method.test
new file mode 100644 (file)
index 0000000..49c8096
--- /dev/null
@@ -0,0 +1,11 @@
+Invalid Code
+
+errordomain Foo {
+       BAD;
+
+       public void bar () {
+       }
+}
+
+void main () {
+}
diff --git a/tests/errors/errordomain-static-method.vala b/tests/errors/errordomain-static-method.vala
new file mode 100644 (file)
index 0000000..871a5e6
--- /dev/null
@@ -0,0 +1,13 @@
+errordomain Foo {
+       BAD = 23;
+
+       public static Foo from_string (string error) {
+               assert (error == "BAD");
+               return new Foo.BAD ("BAD");
+       }
+}
+
+void main () {
+       var e = Foo.from_string ("BAD");
+       assert (e.code == Foo.BAD);
+}
index c0e92e70e69bbcf07d5fce3a24ebd30a9e646a10..0b462849ebf4267b3740e31b9a16e3528ee65018 100644 (file)
@@ -125,6 +125,14 @@ public class Vala.ErrorDomain : TypeSymbol {
                }
 
                foreach (Method m in methods) {
+                       if (m.binding == MemberBinding.INSTANCE) {
+                               if (external_package) {
+                                       Report.warning (m.source_reference, "Instance methods are not supported in error domains yet");
+                               } else {
+                                       Report.error (m.source_reference, "Instance methods are not supported in error domains yet");
+                               }
+                               error = true;
+                       }
                        m.check (context);
                }
 
index 788a6bab6478ad19ca676ad5f782ae1f6e42a2c3..37871f0129c31ebd06dda1e520ab1b4a154b3b0f 100644 (file)
@@ -25,7 +25,6 @@ public errordomain TestErrDomGlobal {
        ERROR1,
        ERROR2;
 
-       public void method ();
        public static void static_method ();
 }
 
index 94f572cfd4201481886bd1f5ad133c9f3cc88a1d..5d20405d66deedb76c3fcf6eb6cb52e18ddce86e 100644 (file)
@@ -257,44 +257,12 @@ public static void test_erroromain_global (Api.ErrorDomain? err, Api.Package pkg
        assert (errc2 == true);
 
 
-
-       Vala.List<Api.Node> methods = err.get_children_by_type (Api.NodeType.METHOD, false);
+       Vala.List<Api.Node> methods = err.get_children_by_type (Api.NodeType.STATIC_METHOD, false);
        assert (methods.size == 1);
 
        Api.Method method = methods.get (0) as Api.Method;
        assert (method != null);
 
-       // (.Method check)
-       assert (method.get_cname () == "test_err_dom_global_method");
-       //assert (method.get_dbus_name () == null);
-       //assert (method.get_dbus_result_name () == null);
-       //assert (method.is_dbus_visible == false);
-       assert (method.base_method == null);
-       assert (method.is_yields == false);
-       assert (method.is_abstract == false);
-       assert (method.is_virtual == false);
-       assert (method.is_override == false);
-       assert (method.is_static == false);
-       assert (method.is_constructor == false);
-       assert (method.is_inline == false);
-       // (.Symbol check)
-       assert (method.is_deprecated == false);
-       assert (method.accessibility == Vala.SymbolAccessibility.PUBLIC);
-       // (.Node)
-       assert (method.get_full_name () == "TestErrDomGlobal.method");
-       assert (method.get_filename () == "api-test.data.vapi");
-       assert (method.name == "method");
-       assert (method.nspace == global_ns);
-       assert (method.package == pkg);
-
-
-
-       methods = err.get_children_by_type (Api.NodeType.STATIC_METHOD, false);
-       assert (methods.size == 1);
-
-       method = methods.get (0) as Api.Method;
-       assert (method != null);
-
        // (.Method check)
        assert (method.get_cname () == "test_err_dom_global_static_method");
        //assert (method.get_dbus_name () == null);