[vala/staging] parser: Map empty start/end index to 0/length for slice expressions



commit 6edde4b658ea372a489b367d6a43f79fe79b0087
Author: wb9688 <36312-wb9688 users noreply gitlab gnome org>
Date:   Tue May 26 11:57:03 2020 +0200

    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

 tests/basic-types/arrays.vala  | 16 ++++++++++++++++
 tests/basic-types/strings.vala | 13 +++++++++++++
 vala/valagenieparser.vala      | 19 ++++++++++++++++---
 vala/valaparser.vala           | 19 ++++++++++++++++---
 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);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]