]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
parser: Map empty start/end index to 0/length for slice expressions 6edde4b658ea372a489b367d6a43f79fe79b0087 126/head
authorwb9688 <36312-wb9688@users.noreply.gitlab.gnome.org>
Tue, 26 May 2020 09:57:03 +0000 (11:57 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 26 May 2020 10:58:33 +0000 (12:58 +0200)
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

tests/basic-types/arrays.vala
tests/basic-types/strings.vala
vala/valagenieparser.vala
vala/valaparser.vala

index f4777a7a7b7f725f6be2b7372b41474133f36508..e87d8c909e0da4ff4d034f1bb7139e4f04bb848f 100644 (file)
@@ -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));
index ecead74c0241a13c5449783e36c2734a350f5fa9..219dde7c848c0a5769b242207a08541dd918030f 100644 (file)
@@ -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 () {
index 45e0d97290beb317e37d230282c5cf18e082857c..ef87646f48349407f37a441240a2f336c6015fa5 100644 (file)
@@ -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);
 
index 9f0b976fc46744219ed661c78eec4e447e6d4e3b..2d7fb3e3c5160af107c63740ffffaf72d2b5ff10 100644 (file)
@@ -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);