]> 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:41:25 +0000 (13:41 +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 51b6fc5845f46378fe0806af536851861928fb58..b40aa51a4b6863d4ad63bb2cd20945e258c61b57 100644 (file)
@@ -1159,6 +1159,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 6a3f790a43d68ae5b3c114c811b01f6afae72bc7..2b760b75e62a8fe00868fd2e6344ad7011f2f54a 100644 (file)
@@ -3675,7 +3675,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 */
@@ -3707,9 +3707,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;