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 \
--- /dev/null
+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");
+ }
+ }
+}
// 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) {
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 ());
// 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) {
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 ());
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);
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);
}
}
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");
// 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);
}
public override DataType copy () {
var result = new VarType (value_owned);
result.nullable = nullable;
+ result.is_dynamic = is_dynamic;
return result;
}
}