[vala/staging] vala: Support "unowned var" to declare local variables
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/staging] vala: Support "unowned var" to declare local variables
- Date: Tue, 5 Nov 2019 22:04:58 +0000 (UTC)
commit 39331e235f1183223c8ea685e3501ab4ca932c8f
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Thu Oct 3 20:42:58 2019 +0200
vala: Support "unowned var" to declare local variables
Based on patch by Aaron Andersen
Fixes https://gitlab.gnome.org/GNOME/vala/issues/152
tests/Makefile.am | 1 +
tests/parser/local-variable.vala | 10 ++++++++++
vala/Makefile.am | 1 +
vala/valalocalvariable.vala | 11 ++++++++---
vala/valaparser.vala | 13 +++++++++----
vala/valavartype.vala | 38 ++++++++++++++++++++++++++++++++++++++
6 files changed, 67 insertions(+), 7 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index daf29e9dc..757cc0851 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -586,6 +586,7 @@ TESTS = \
parser/function-syntax-error.test \
parser/inner-array-size.test \
parser/invalid-brace.test \
+ parser/local-variable.vala \
parser/lock-statement.vala \
parser/main-block.vala \
parser/method-no-abstract-override.test \
diff --git a/tests/parser/local-variable.vala b/tests/parser/local-variable.vala
new file mode 100644
index 000000000..fc22135f0
--- /dev/null
+++ b/tests/parser/local-variable.vala
@@ -0,0 +1,10 @@
+void main () {
+ {
+ var foo = "foo";
+ var bar = 42;
+ }
+ {
+ unowned var foo = "foo";
+ unowned var bar = 42;
+ }
+}
diff --git a/vala/Makefile.am b/vala/Makefile.am
index c6aed1c54..78e4c9390 100644
--- a/vala/Makefile.am
+++ b/vala/Makefile.am
@@ -177,6 +177,7 @@ libvala_la_VALASOURCES = \
valausingdirective.vala \
valavaluetype.vala \
valavariable.vala \
+ valavartype.vala \
valaversion.vala \
valaversionattribute.vala \
valavoidtype.vala \
diff --git a/vala/valalocalvariable.vala b/vala/valalocalvariable.vala
index f6a39ba8e..e334301c5 100644
--- a/vala/valalocalvariable.vala
+++ b/vala/valalocalvariable.vala
@@ -79,6 +79,10 @@ public class Vala.LocalVariable : Variable {
checked = true;
+ if (variable_type == null) {
+ variable_type = new VarType ();
+ }
+
if (!context.experimental_non_null) {
// local reference variables are considered nullable
// except when using experimental non-null enhancements
@@ -92,7 +96,7 @@ public class Vala.LocalVariable : Variable {
}
}
- if (variable_type != null) {
+ if (!(variable_type is VarType)) {
if (variable_type is VoidType) {
error = true;
Report.error (source_reference, "'void' not supported as variable type");
@@ -122,7 +126,7 @@ public class Vala.LocalVariable : Variable {
}
}
- if (variable_type == null) {
+ if (variable_type is VarType) {
/* var type */
if (initializer == null) {
@@ -141,8 +145,9 @@ public class Vala.LocalVariable : Variable {
return false;
}
+ bool value_owned = variable_type.value_owned;
variable_type = initializer.value_type.copy ();
- variable_type.value_owned = true;
+ variable_type.value_owned = value_owned;
variable_type.floating_reference = false;
initializer.target_type = variable_type;
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index fe4e16915..587f6b159 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -1784,14 +1784,19 @@ public class Vala.Parser : CodeVisitor {
void parse_local_variable_declarations (Block block) throws ParseError {
var begin = get_location ();
DataType variable_type;
- if (accept (TokenType.VAR)) {
- variable_type = null;
+ if (accept (TokenType.UNOWNED) && accept (TokenType.VAR)) {
+ variable_type = new VarType (false);
} else {
- variable_type = parse_type (true, true);
+ rollback (begin);
+ if (accept (TokenType.VAR)) {
+ variable_type = new VarType ();
+ } else {
+ variable_type = parse_type (true, true);
+ }
}
bool is_first = true;
do {
- if (variable_type == null && accept (TokenType.OPEN_PARENS)) {
+ if (variable_type is VarType && variable_type.value_owned && accept
(TokenType.OPEN_PARENS)) {
// tuple
begin = get_location ();
diff --git a/vala/valavartype.vala b/vala/valavartype.vala
new file mode 100644
index 000000000..7187fc2c9
--- /dev/null
+++ b/vala/valavartype.vala
@@ -0,0 +1,38 @@
+/* valavartype.vala
+ *
+ * Copyright (C) 2019 Rico Tzschichholz
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author:
+ * Rico Tzschichholz <ricotz ubuntu com>
+ */
+
+/**
+ * A to be inferred data type.
+ */
+public class Vala.VarType : DataType {
+ public VarType (bool value_owned = true) {
+ this.value_owned = value_owned;
+ }
+
+ public override string to_qualified_string (Scope? scope) {
+ return (value_owned ? "var" : "unowned var");
+ }
+
+ public override DataType copy () {
+ return new VarType (value_owned);
+ }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]