]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
genie: Accept accessibility and async modifiers on "construct" creation methods
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 23 Nov 2021 13:19:02 +0000 (14:19 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 29 Nov 2021 12:06:37 +0000 (13:06 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1235

tests/Makefile.am
tests/genie/class-abstract.gs [new file with mode: 0644]
vala/valagenieparser.vala

index cf7198fa4069973f135bf3a4f8f595bdb5b46e50..7fab0a41b3cc99ad376de94d71df94ef5ec0d985 100644 (file)
@@ -1220,6 +1220,7 @@ TESTS = \
        version/since-parameter.test \
        genie/case.gs \
        genie/class.gs \
+       genie/class-abstract.gs \
        genie/class-field.gs \
        genie/class-init.gs \
        genie/class-property.gs \
diff --git a/tests/genie/class-abstract.gs b/tests/genie/class-abstract.gs
new file mode 100644 (file)
index 0000000..b7f894b
--- /dev/null
@@ -0,0 +1,12 @@
+init
+       print "abstract class"
+
+class abstract Test
+       a:string
+       construct protected()
+               a = "a"
+
+class abstract Test2
+       b:string
+       construct async protected()
+               b = "b"
index d7f95cda9a1aa9bac30ad684ca59faeaf498b7b4..f074df73d86b7a7205fa64e591019dc4e5b44445 100644 (file)
@@ -3696,7 +3696,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                CreationMethod method;
 
                expect (TokenType.CONSTRUCT);
-               parse_member_declaration_modifiers ();
+               var flags = parse_member_declaration_modifiers ();
 
                if (accept (TokenType.OPEN_PARENS)) {
                        /* create default name using class name */
@@ -3728,9 +3728,21 @@ public class Vala.Genie.Parser : CodeVisitor {
                                method.add_error_type (parse_type (true, false));
                        } while (accept (TokenType.COMMA));
                }
-               method.access = SymbolAccessibility.PUBLIC;
+
+               if (ModifierFlags.PRIVATE in flags) {
+                       method.access = SymbolAccessibility.PRIVATE;
+               } else if (ModifierFlags.PROTECTED in flags) {
+                       method.access = SymbolAccessibility.PROTECTED;
+               } else {
+                       method.access = SymbolAccessibility.PUBLIC;
+               }
+
                set_attributes (method, attrs);
 
+               if (ModifierFlags.ASYNC in flags) {
+                       method.coroutine = true;
+               }
+
                if (accept_block ()) {
                        method.body = parse_block ();
                        method.external = false;