| // Copyright (c) 2022, 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 pattern on the left side of an assignment expression is used to |
| /// destructure the assigned value. We extend expression: |
| /// |
| /// expression ::= patternAssignment |
| /// | // Existing productions... |
| /// |
| /// patternAssignment ::= outerPattern '=' expression |
| /// ... |
| /// It is a compile-time error if: |
| /// |
| /// An identifier in a variable pattern does not resolve to an assignable local |
| /// variable or formal parameter. A variable is assignable if it is any of: |
| /// |
| /// - Non-final |
| /// - Final and definitely unassigned |
| /// - Late final and not definitely assigned |
| /// |
| /// @description Check that it is no compile-time error if an identifier in a |
| /// variable pattern is late final and not definitely assigned |
| /// @author sgrekhov22@gmail.com |
| |
| import "../../Utils/expect.dart"; |
| import "patterns_lib.dart"; |
| |
| main() { |
| var a = 42; |
| (int, int) r = (0, 0); |
| late final int af1, af2, af3, af4, af5, af6, af7, af8, areaAsInt; |
| late final (int, int) rf; |
| late final List<int> lf; |
| |
| if (1 > 2) { |
| af1 = 0; |
| af2 = 0; |
| af3 = 0; |
| af4 = 0; |
| af5 = 0; |
| af6 = 0; |
| af7 = 0; |
| af8 = 0; |
| areaAsInt = 0; |
| rf = (0, 0); |
| lf = [0]; |
| } |
| |
| ((af1, _) && r) = (1, 2); |
| Expect.equals(1, af1); |
| Expect.equals(1, r.$1); |
| Expect.equals(2, r.$2); |
| |
| ((a, _) && rf) = (1, 2); |
| Expect.equals(1, a); |
| Expect.equals(1, rf.$1); |
| Expect.equals(2, rf.$2); |
| |
| [af2, _] = [1, 2]; |
| Expect.equals(1, af2); |
| |
| [a, ...lf] = [1, 2]; |
| Expect.equals(1, a); |
| Expect.listEquals([2], lf); |
| |
| {"key1": af3, "key2": _} = {"key1": 1, "key2": 2}; |
| Expect.equals(1, af3); |
| |
| {"key1": af4} = {"key1": 1, "key2": 2}; |
| Expect.equals(1, af4); |
| |
| (af5, _) = (1, 2); |
| Expect.equals(1, af5); |
| |
| (n1: af6, _) = (n1: 1, 2); |
| Expect.equals(1, af6); |
| |
| (:af7, _) = (af7: 1, 2); |
| Expect.equals(1, af7); |
| |
| Square(areaAsInt: af8) = Square(1); |
| Expect.equals(1, af8); |
| |
| Square(:areaAsInt) = Square(1); |
| Expect.equals(1, areaAsInt); |
| } |