From 6edde4b658ea372a489b367d6a43f79fe79b0087 Mon Sep 17 00:00:00 2001 From: wb9688 <36312-wb9688@users.noreply.gitlab.gnome.org> Date: Tue, 26 May 2020 11:57:03 +0200 Subject: 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 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 index_list; + + expect (TokenType.OPEN_BRACKET); + if (current () == TokenType.COLON) { + // slice expression + index_list = new ArrayList (); + 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 index_list; + + expect (TokenType.OPEN_BRACKET); + if (current () == TokenType.COLON) { + // slice expression + index_list = new ArrayList (); + 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); -- cgit v1.2.1