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
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));
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 () {
}
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);
}
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);