blob: f6b1ad499c4352f2e6d47a981296b8c2e639ec9d [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// @assertion A list literal <E>[elem_1 ... elem_n] is evaluated as follows:
///
/// 2. For each element in the list literal:
/// i. Evaluate the element's expression to a value value.
/// ii. If element is a spread element:
/// a. If element is null-aware and value is [null], continue to the next
/// element in the literal.
/// b. Evaluate [value.iterator] to a [value] iterator.
/// c. Loop:
/// a. If [iterator.moveNext()] returns [false], exit the loop.
/// b. Evaluate [iterator.current] and append the result to list.
/// iii. Else:
/// a. Append value to list.
///
/// @description Checks that elements are added to the result list in correct
/// order.
/// @author iarkh@unipro.ru
import "dart:collection";
import "../../Utils/expect.dart";
class MyIterable extends IterableBase {
late List list;
MyIterable(this.list);
Iterator get iterator => MyIterator(list);
}
class MyIterator implements Iterator {
int i = -1;
late List list;
MyIterator(List aList) { list = aList; }
@override
bool moveNext() { return ++i < list.length; }
@override
dynamic get current { return list[i]; }
}
List aList = [11, 28];
Set aSet = {};
Iterable it1 = new MyIterable([1, 2, 3, 4, 5]);
Iterable it2 = new MyIterable(["a", "14", "1", "2", null, 143, aList]);
Iterable it3 = [100, 200, aSet, aList, 300];
Iterable it4 = [];
Iterable? it5 = null;
main() {
Expect.listEquals(
[-1, -2, -3, 1, 2, 3, 4, 5, 6, 7], [-1, -2, -3, ...it1, 6, 7]);
Expect.listEquals(
[-1, -2, -3, 1, 2, 3, 4, 5, 6, 7], [-1, -2, -3, ...?it1, 6, 7]);
// ^^^^
// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
Expect.listEquals([1, 2, 3], [1, ...it4, 2, ...?it4, 3, ...?it5]);
// ^^^^
// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
Expect.listEquals([-9, -8, 1, 2, 3, 4, 5, -7, "a", "14", "1", "2", null, 143,
aList, -6, 100, 200, aSet, aList, 300, -5, -4, -3, -2],
[-9, -8, ...it1, -7, ...?it2, -6, ...it3, -5, -4, ...it4, -3, -2]);
// ^^^^
// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
}