summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwb9688 <36312-wb9688@users.noreply.gitlab.gnome.org>2020-05-26 11:57:03 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2020-05-26 12:58:33 +0200
commit6edde4b658ea372a489b367d6a43f79fe79b0087 (patch)
tree97438ace4874ef8f0237bc4f7dd3c25c84bcf6ba
parent6312d8c7563c227b77d2098c9de1048f65c3b51f (diff)
downloadvala-6edde4b658ea372a489b367d6a43f79fe79b0087.tar.gz
parser: Map empty start/end index to 0/length for slice expressions
This allows a syntax like a[:], a[2:] or a[:3] for arrays and strings. Co-authored-by: Simon Werbeck <simon.werbeck@gmail.com> Fixes https://gitlab.gnome.org/GNOME/vala/issues/238
-rw-r--r--tests/basic-types/arrays.vala16
-rw-r--r--tests/basic-types/strings.vala13
-rw-r--r--vala/valagenieparser.vala19
-rw-r--r--vala/valaparser.vala19
4 files changed, 61 insertions, 6 deletions
diff --git a/tests/basic-types/arrays.vala b/tests/basic-types/arrays.vala
index f4777a7a7..e87d8c909 100644
--- a/tests/basic-types/arrays.vala
+++ b/tests/basic-types/arrays.vala
@@ -42,6 +42,22 @@ void test_integer_array () {
assert (c0 == null);
assert (c0.length == 0);
+ int[] c1 = a[1:];
+ assert (c1.length == 2);
+ assert (c1[0] == 23);
+ assert (c1[1] == 11);
+
+ int[] c2 = a[:2];
+ assert (c2.length == 2);
+ assert (c2[0] == 42);
+ assert (c2[1] == 23);
+
+ int[] c3 = a[:];
+ assert (c3.length == 3);
+ assert (c3[0] == 42);
+ assert (c3[1] == 23);
+ assert (c3[2] == 11);
+
// in expressions
assert (23 in a);
assert (!(-1 in a));
diff --git a/tests/basic-types/strings.vala b/tests/basic-types/strings.vala
index ecead74c0..219dde7c8 100644
--- a/tests/basic-types/strings.vala
+++ b/tests/basic-types/strings.vala
@@ -33,6 +33,19 @@ void test_string () {
assert (t.length == 2);
assert (t[0] == 'l');
assert (t[1] == 'l');
+
+ t = s[-2:];
+ assert (t.length == 2);
+ assert (t[0] == 'l');
+ assert (t[1] == 'o');
+
+ t = s[:2];
+ assert (t.length == 2);
+ assert (t[0] == 'h');
+ assert (t[1] == 'e');
+
+ t = s[:];
+ assert (t == s);
}
void test_string_joinv () {
diff --git a/vala/valagenieparser.vala b/vala/valagenieparser.vala
index 45e0d9729..ef87646f4 100644
--- a/vala/valagenieparser.vala
+++ b/vala/valagenieparser.vala
@@ -963,12 +963,25 @@ public class Vala.Genie.Parser : CodeVisitor {
}
Expression parse_element_access (SourceLocation begin, Expression inner) throws ParseError {
- expect (TokenType.OPEN_BRACKET);
- var index_list = parse_expression_list ();
Expression? stop = null;
+ List<Expression> index_list;
+
+ expect (TokenType.OPEN_BRACKET);
+ if (current () == TokenType.COLON) {
+ // slice expression
+ index_list = new ArrayList<Expression> ();
+ index_list.add (new IntegerLiteral ("0", get_src (begin)));
+ } else {
+ index_list = parse_expression_list ();
+ }
+
if (index_list.size == 1 && accept (TokenType.COLON)) {
// slice expression
- stop = parse_expression ();
+ if (current () == TokenType.CLOSE_BRACKET) {
+ stop = new MemberAccess (inner, "length", get_src (begin));
+ } else {
+ stop = parse_expression ();
+ }
}
expect (TokenType.CLOSE_BRACKET);
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index 9f0b976fc..2d7fb3e3c 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -844,12 +844,25 @@ public class Vala.Parser : CodeVisitor {
}
Expression parse_element_access (SourceLocation begin, Expression inner) throws ParseError {
- expect (TokenType.OPEN_BRACKET);
- var index_list = parse_expression_list ();
Expression? stop = null;
+ List<Expression> index_list;
+
+ expect (TokenType.OPEN_BRACKET);
+ if (current () == TokenType.COLON) {
+ // slice expression
+ index_list = new ArrayList<Expression> ();
+ index_list.add (new IntegerLiteral ("0", get_src (begin)));
+ } else {
+ index_list = parse_expression_list ();
+ }
+
if (index_list.size == 1 && accept (TokenType.COLON)) {
// slice expression
- stop = parse_expression ();
+ if (current () == TokenType.CLOSE_BRACKET) {
+ stop = new MemberAccess (inner, "length", get_src (begin));
+ } else {
+ stop = parse_expression ();
+ }
}
expect (TokenType.CLOSE_BRACKET);