]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
WIP parser: Allow usage of dynamic on VarType wip/issue/187
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 25 Jan 2022 20:54:09 +0000 (21:54 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 25 Jan 2022 20:54:09 +0000 (21:54 +0100)
tests/Makefile.am
tests/parser/var-type-dynamic.vala [new file with mode: 0644]
vala/valaforeachstatement.vala
vala/valalocalvariable.vala
vala/valaparser.vala
vala/valavartype.vala

index 0b9f71524c137982924d54bffe6908f41f6fb364..06bbb00490026ec939f41133f2ed049c2b47f385 100644 (file)
@@ -972,6 +972,7 @@ TESTS = \
        parser/using-ambiguous-reference.test \
        parser/using-directive.vala \
        parser/using-invalid-namespace.test \
+       parser/var-type-dynamic.vala \
        parser/var-type-nullable.vala \
        parser/with-embedded.vala \
        parser/with-empty.vala \
diff --git a/tests/parser/var-type-dynamic.vala b/tests/parser/var-type-dynamic.vala
new file mode 100644 (file)
index 0000000..669e496
--- /dev/null
@@ -0,0 +1,66 @@
+class Foo : Object {
+       public string manam { get; set; default = "foo"; }
+}
+
+void main () {
+       var foo = new Foo ();
+       var foo_list = new List<Foo> ();
+       foo_list.prepend (foo);
+
+       {
+               dynamic var bar = foo;
+               assert (bar.manam == "foo");
+       }
+       {
+               dynamic unowned var bar = foo;
+               assert (bar.manam == "foo");
+       }
+       {
+               dynamic var? bar = foo;
+               assert (bar.manam == "foo");
+       }
+       {
+               dynamic unowned var? bar = foo;
+               assert (bar.manam == "foo");
+       }
+       {
+               foreach (dynamic var bar in foo_list) {
+                       assert (bar.manam == "foo");
+               }
+       }
+       {
+               foreach (dynamic unowned var bar in foo_list) {
+                       assert (bar.manam == "foo");
+               }
+       }
+       {
+               foreach (dynamic var? bar in foo_list) {
+                       assert (bar.manam == "foo");
+               }
+       }
+       {
+               foreach (dynamic unowned var? bar in foo_list) {
+                       assert (bar.manam == "foo");
+               }
+       }
+       {
+               with (dynamic var bar = foo) {
+                       assert (manam == "foo");
+               }
+       }
+       {
+               with (dynamic unowned var bar = foo) {
+                       assert (manam == "foo");
+               }
+       }
+       {
+               with (dynamic var? bar = foo) {
+                       assert (manam == "foo");
+               }
+       }
+       {
+               with (dynamic unowned var? bar = foo) {
+                       assert (manam == "foo");
+               }
+       }
+}
index f491c037f60dbdf04692bbecf79dd7f587e579f5..a76938718b564ea60b4b49e14f1fe623969169ec 100644 (file)
@@ -342,6 +342,7 @@ public class Vala.ForeachStatement : Block {
                        // var type
                        bool nullable = type_reference.nullable;
                        bool value_owned = type_reference.value_owned;
+                       bool is_dynamic = type_reference.nullable;
                        type_reference = element_type.copy ();
                        // FIXME Only follows "unowned var" otherwise inherit ownership of element-type
                        if (!value_owned) {
@@ -350,6 +351,9 @@ public class Vala.ForeachStatement : Block {
                        if (nullable) {
                                type_reference.nullable = true;
                        }
+                       if (is_dynamic) {
+                               type_reference.is_dynamic = true;
+                       }
                } else if (!element_type.compatible (type_reference)) {
                        error = true;
                        Report.error (source_reference, "Foreach: Cannot convert from `%s' to `%s'", element_type.to_string (), type_reference.to_string ());
@@ -369,6 +373,7 @@ public class Vala.ForeachStatement : Block {
                        // var type
                        bool nullable = type_reference.nullable;
                        bool value_owned = type_reference.value_owned;
+                       bool is_dynamic = type_reference.nullable;
                        type_reference = element_type.copy ();
                        // FIXME Only follows "unowned var" otherwise inherit ownership of element-type
                        if (!value_owned) {
@@ -377,6 +382,9 @@ public class Vala.ForeachStatement : Block {
                        if (nullable) {
                                type_reference.nullable = true;
                        }
+                       if (is_dynamic) {
+                               type_reference.is_dynamic = true;
+                       }
                } else if (!element_type.compatible (type_reference)) {
                        error = true;
                        Report.error (source_reference, "Foreach: Cannot convert from `%s' to `%s'", element_type.to_string (), type_reference.to_string ());
index e2a5c92c24c843ad353c8a116ef8ec4cb5dbcad5..7bd67a3910cd2116c1d977d8c0bffa2523846ec2 100644 (file)
@@ -156,12 +156,16 @@ public class Vala.LocalVariable : Variable {
 
                        bool nullable = variable_type.nullable;
                        bool value_owned = variable_type.value_owned;
+                       bool is_dynamic = variable_type.nullable;
                        variable_type = initializer.value_type.copy ();
                        variable_type.value_owned = value_owned;
                        variable_type.floating_reference = false;
                        if (nullable) {
                                variable_type.nullable = true;
                        }
+                       if (is_dynamic) {
+                               variable_type.is_dynamic = true;
+                       }
 
                        initializer.target_type = variable_type;
                        variable_type.check (context);
index 1e84c8bfa99a348ede19fea9280eb260ca3736e1..a8f083a82ab4e3d08751e287b82319fd15846088 100644 (file)
@@ -2063,15 +2063,20 @@ public class Vala.Parser : CodeVisitor {
        void parse_local_variable_declarations (Block block) throws ParseError {
                var begin = get_location ();
                DataType variable_type;
+               bool is_dynamic = accept (TokenType.DYNAMIC);
                if (accept (TokenType.UNOWNED) && accept (TokenType.VAR)) {
                        variable_type = new VarType (false);
                        variable_type.nullable = accept (TokenType.INTERR);
+                       variable_type.is_dynamic = is_dynamic;
                } else {
                        rollback (begin);
+                       is_dynamic = accept (TokenType.DYNAMIC);
                        if (accept (TokenType.VAR)) {
                                variable_type = new VarType ();
                                variable_type.nullable = accept (TokenType.INTERR);
+                               variable_type.is_dynamic = is_dynamic;
                        } else {
+                               rollback (begin);
                                variable_type = parse_type (true, true);
                        }
                }
@@ -2375,15 +2380,20 @@ public class Vala.Parser : CodeVisitor {
                expect (TokenType.OPEN_PARENS);
                var var_or_type = get_location ();
                DataType type;
+               bool is_dynamic = accept (TokenType.DYNAMIC);
                if (accept (TokenType.UNOWNED) && accept (TokenType.VAR)) {
                        type = new VarType (false);
                        type.nullable = accept (TokenType.INTERR);
+                       type.is_dynamic = is_dynamic;
                } else {
                        rollback (var_or_type);
+                       is_dynamic = accept (TokenType.DYNAMIC);
                        if (accept (TokenType.VAR)) {
                                type = new VarType ();
                                type.nullable = accept (TokenType.INTERR);
+                               type.is_dynamic = is_dynamic;
                        } else {
+                               rollback (var_or_type);
                                type = parse_type (true, true);
                                if (accept (TokenType.IN)) {
                                        Report.error (type.source_reference, "syntax error, expected `unowned var', `var' or type");
@@ -2551,14 +2561,18 @@ public class Vala.Parser : CodeVisitor {
                        // Try "with (var identifier = expr)"
                        rollback (expr_or_decl);
                        DataType variable_type;
+                       bool is_dynamic = accept (TokenType.DYNAMIC);
                        if (accept (TokenType.UNOWNED) && accept (TokenType.VAR)) {
                                variable_type = new VarType (false);
                                variable_type.nullable = accept (TokenType.INTERR);
+                               variable_type.is_dynamic = is_dynamic;
                        } else {
                                rollback (expr_or_decl);
+                               is_dynamic = accept (TokenType.DYNAMIC);
                                if (accept (TokenType.VAR)) {
                                        variable_type = new VarType ();
                                        variable_type.nullable = accept (TokenType.INTERR);
+                                       variable_type.is_dynamic = is_dynamic;
                                } else {
                                        variable_type = parse_type (true, true);
                                }
index be97e175230bacafed230945fa6eda77715f0ca2..b31af255fa4111a392f10d78a33fef36d26ecba3 100644 (file)
@@ -35,6 +35,7 @@ public class Vala.VarType : DataType {
        public override DataType copy () {
                var result = new VarType (value_owned);
                result.nullable = nullable;
+               result.is_dynamic = is_dynamic;
                return result;
        }
 }