| // Copyright (c) 2024, 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. | |
| // This test verifies that a null-aware extension method invocation is properly | |
| // treated as unreachable when the target has type `Null`. | |
| import '../static_type_helper.dart'; | |
| class C { | |
| void method(Object? o) {} | |
| C operator +(Object? other) => this; | |
| } | |
| extension E on Null { | |
| C extensionMethod(Object? o) => C(); | |
| C get extensionProperty => C(); | |
| set extensionProperty(Object? value) {} | |
| C? get nullableExtensionProperty => C(); | |
| set nullableExtensionProperty(Object? value) {} | |
| C operator [](Object? index) => C(); | |
| operator []=(Object? index, Object? value) {} | |
| } | |
| extension E2 on C { | |
| C? operator [](Object? index) => C(); | |
| operator []=(Object? index, Object? value) {} | |
| } | |
| testLiteralNull() { | |
| int? i = 0; // Promotes to non-null. | |
| i.expectStaticType<Exactly<int>>(); | |
| E(null)?.extensionMethod(i = null); | |
| i.expectStaticType<Exactly<int>>(); | |
| E(null)?.extensionProperty.method(i = null); | |
| i.expectStaticType<Exactly<int>>(); | |
| E(null)?.extensionProperty = i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E(null)?.extensionProperty += i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E(null)?.nullableExtensionProperty ??= i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E(null)?[i = null].method(i = null); | |
| i.expectStaticType<Exactly<int>>(); | |
| E(null)?[i = null] = i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E(null)?[i = null] += i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E2(null)?[i = null] ??= i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| } | |
| testNullVariable(Null n) { | |
| int? i = 0; // Promotes to non-null. | |
| i.expectStaticType<Exactly<int>>(); | |
| E(n)?.extensionMethod(i = null); | |
| i.expectStaticType<Exactly<int>>(); | |
| E(n)?.extensionProperty.method(i = null); | |
| i.expectStaticType<Exactly<int>>(); | |
| E(n)?.extensionProperty = i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E(n)?.extensionProperty += i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E(n)?.nullableExtensionProperty ??= i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E(n)?[i = null].method(i = null); | |
| i.expectStaticType<Exactly<int>>(); | |
| E(n)?[i = null] = i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E(n)?[i = null] += i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| E2(n)?[i = null] ??= i = null; | |
| i.expectStaticType<Exactly<int>>(); | |
| } | |
| main() { | |
| testLiteralNull(); | |
| testNullVariable(null); | |
| } |