| // Copyright (c) 2023, 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. |
| |
| /// Test that the appropriate errors are generated if a nullable type is used in |
| /// an object pattern. |
| |
| import 'package:expect/expect.dart'; |
| |
| typedef A = int?; |
| |
| bool nullableWithoutField(x) { |
| // This is fine because all the implementation needs to do is a type test. |
| switch (x) { |
| case A(): |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool potentiallyNullableWithoutField<T extends int?>(x) { |
| // This is fine because all the implementation needs to do is a type test. |
| switch (x) { |
| case T(): |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool nonNullableTypeArgument<T extends int>(x) { |
| // This is fine error because `isEven` *can* be called on `int`. |
| switch (x) { |
| case T(isEven: true): |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool nullableWithObjectFields(x) { |
| // This is fine because the fields `hashCode` and `runtimeType` are defined on |
| // `null`. |
| switch (x) { |
| case A(:var runtimeType, :var hashCode): |
| Expect.equals(x.runtimeType, runtimeType); |
| Expect.equals(x.hashCode, hashCode); |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| main() { |
| Expect.equals(true, nullableWithoutField(null)); |
| Expect.equals(true, nullableWithoutField(0)); |
| Expect.equals(false, nullableWithoutField('')); |
| Expect.equals(true, potentiallyNullableWithoutField<int?>(null)); |
| Expect.equals(true, potentiallyNullableWithoutField<int?>(0)); |
| Expect.equals(false, potentiallyNullableWithoutField<int?>('')); |
| Expect.equals(false, potentiallyNullableWithoutField<int>(null)); |
| Expect.equals(true, potentiallyNullableWithoutField<int>(0)); |
| Expect.equals(false, potentiallyNullableWithoutField<int>('')); |
| Expect.equals(false, potentiallyNullableWithoutField<Never>(null)); |
| Expect.equals(false, potentiallyNullableWithoutField<Never>(0)); |
| Expect.equals(false, potentiallyNullableWithoutField<Never>('')); |
| Expect.equals(false, nonNullableTypeArgument<int>(null)); |
| Expect.equals(true, nonNullableTypeArgument<int>(0)); |
| Expect.equals(false, nonNullableTypeArgument<int>(1)); |
| Expect.equals(false, nonNullableTypeArgument<int>('')); |
| Expect.equals(false, nonNullableTypeArgument<Never>(null)); |
| Expect.equals(false, nonNullableTypeArgument<Never>(0)); |
| Expect.equals(false, nonNullableTypeArgument<Never>(1)); |
| Expect.equals(false, nonNullableTypeArgument<Never>('')); |
| Expect.equals(true, nullableWithObjectFields(null)); |
| Expect.equals(true, nullableWithObjectFields(0)); |
| Expect.equals(false, nullableWithObjectFields('')); |
| } |