blob: 62f2eacf0e177e33dd61b704f2ee0bd5e5cda8fd [file] [log] [blame]
// 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.
sealed class A {}
class B extends A {}
class C extends A {}
extension type ExtensionTypeList<T>(List<T> it) implements List<T> {}
extension type ExtensionTypeMap<K, V>(Map<K, V> it) implements Map<K, V> {
V method(K key) => it[key]!;
V get getter => it.values.first;
void genericMethod<T>(K key, V value, void Function<T>(T) f) {}
}
nonExhaustiveSealedSubtype(ExtensionTypeList<A> list) {
return switch (list) {
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_EXHAUSTIVE_SWITCH_EXPRESSION
// ^
// [cfe] The type 'ExtensionTypeList<A>' is not exhaustively matched by the switch cases since it doesn't match '[B(), C()]'.
[] => 0,
[_] => 1,
[_, B()] => 2,
[_, _, _, ...] => 3,
};
}
nonExhaustiveMapExtensionType1(ExtensionTypeMap<int, A> map) {
var a = switch (map) {
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_EXHAUSTIVE_SWITCH_EXPRESSION
// ^
// [cfe] The type 'ExtensionTypeMap<int, A>' is not exhaustively matched by the switch cases since it doesn't match 'Map<int, A>(isEmpty: false)'.
Map(isEmpty: true) => 0,
{0: B b, 1: _} => 4,
{0: C c, 1: _} => 5,
{0: _, 1: _} => 3,
// ^^
// [analyzer] HINT.UNREACHABLE_SWITCH_CASE
{0: B b} => 1,
{0: C c} => 2,
};
}
nonExhaustiveMapExtensionType2(ExtensionTypeMap<int, A> map) {
var c = switch (map) {
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_EXHAUSTIVE_SWITCH_EXPRESSION
// ^
// [cfe] The type 'ExtensionTypeMap<int, A>' is not exhaustively matched by the switch cases since it doesn't match 'Map<int, A>()'.
Map<int, B>() => 0,
};
}
nonExhaustiveMapMethod(ExtensionTypeMap<int, A> map) {
return switch (map) {
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_EXHAUSTIVE_SWITCH_EXPRESSION
// ^
// [cfe] The type 'ExtensionTypeMap<int, A>' is not exhaustively matched by the switch cases since it doesn't match 'Map<int, A>(method: A Function(int) _)'.
ExtensionTypeMap(:B Function(int) method) => 0,
};
}
nonExhaustiveMapGetter(ExtensionTypeMap<int, A> map) {
return switch (map) {
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_EXHAUSTIVE_SWITCH_EXPRESSION
// ^
// [cfe] The type 'ExtensionTypeMap<int, A>' is not exhaustively matched by the switch cases since it doesn't match 'Map<int, A>(getter: C())'.
ExtensionTypeMap(:B getter) => 0,
};
}
nonExhaustiveMapGenericMethod(ExtensionTypeMap<int, A> map) {
return switch (map) {
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_EXHAUSTIVE_SWITCH_EXPRESSION
// ^
// [cfe] The type 'ExtensionTypeMap<int, A>' is not exhaustively matched by the switch cases since it doesn't match 'Map<int, A>(genericMethod: void Function<T>(int, A, void Function<T>(T)) _)'.
ExtensionTypeMap(
:void Function<X>(int, B, void Function(X)) genericMethod) => 0,
};
}
nonExhaustiveMapField(ExtensionTypeMap<int, A> map) {
return switch (map) {
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NON_EXHAUSTIVE_SWITCH_EXPRESSION
// ^
// [cfe] The type 'ExtensionTypeMap<int, A>' is not exhaustively matched by the switch cases since it doesn't match 'Map<int, A>(it: Map<int, A>())'.
ExtensionTypeMap(:Map<int, B> it) => 0,
};
}