| // 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 If a map literal has a downwards inference type of [Map<K, V>] for |
| /// some [K] and [V], then the downwards inference context type of a spread |
| /// element in that map is [Map<K, V>]. |
| /// @description Checks statically that a spread element inference context type |
| /// is [K, V] in the map literal |
| /// @author iarkh@unipro.ru |
| |
| |
| class A1 {} |
| class B1 extends A1 {} |
| class C1 extends B1 {} |
| |
| class A2 {} |
| class B2 extends A2 {} |
| class C2 extends B2 {} |
| |
| Map<K, V> getAMap<K, V>(var a, var b) { return <K, V>{a: b}; } |
| |
| main() { |
| var int_map = getAMap<int, int>(1, 2); |
| var str_map = getAMap<int, String>(1, "test"); |
| |
| var a_map = getAMap<A1, A2>(new A1(), new A2()); |
| var b_map = getAMap<B1, B2>(new B1(), new B2()); |
| var c_map = getAMap<C1, C2>(new C1(), new C2()); |
| |
| Map map1 = <int, int>{2: 4, 7: 16, ...int_map, 4: 40}; |
| Map map2 = <A1, A2>{new A1(): new A2(), ...?a_map}; |
| // ^^^^ |
| // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR |
| // ^ |
| // [cfe] Operand of null-aware operation '...?' has type 'Map<A1, A2>' which excludes null. |
| Map map3 = <A1, A2>{new A1(): new A2(), ...b_map}; |
| Map map4 = <A1, A2>{new A1(): new A2(), ...c_map, new B1(): new C2()}; |
| Map map5 = <A1, A2>{new A1(): new B2(), new B1(): new C2(), |
| new C1(): new C2(), ...?c_map, new B1(): new A2(), ...a_map, ...b_map, |
| // ^^^^ |
| // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR |
| // ^ |
| // [cfe] Operand of null-aware operation '...?' has type 'Map<C1, C2>' which excludes null. |
| new A1(): new C2()}; |
| Map map6 = <B1, B2>{new B1(): new B2(), ...?b_map, new C1(): new C2(), |
| // ^^^^ |
| // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR |
| // ^ |
| // [cfe] Operand of null-aware operation '...?' has type 'Map<B1, B2>' which excludes null. |
| ...c_map}; |
| Map map7 = {123: 14, "123": "1", new A1(): null, new A2(): new C1(), ...a_map, |
| ...?b_map, 148: new C1(), ...?c_map, ...int_map, 1499: null, -7: []}; |
| // ^^^^ |
| // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR |
| // ^ |
| // [cfe] Operand of null-aware operation '...?' has type 'Map<B1, B2>' which excludes null. |
| // ^^^^ |
| // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR |
| // ^ |
| // [cfe] Operand of null-aware operation '...?' has type 'Map<C1, C2>' which excludes null. |
| } |