blob: a5d04099776becebcab8b836e9fa69f4fc96ccb2 [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.
import 'package:expect/expect.dart';
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) f) {}
}
exhaustiveListExtensionType(ExtensionTypeList<A> list) {
return switch (list) {
[] => 0,
[B()] => 1,
[C()] => 2,
[_, _, ...]=> 3,
};
}
exhaustiveMapExtensionType1(ExtensionTypeMap<int, A> map) {
return switch (map) {
Map() => 0,
};
}
exhaustiveMapExtensionType2(ExtensionTypeMap<int, A> map) {
return switch (map) {
Map(isEmpty: true) => 0,
Map(isEmpty: false) => 1,
};
}
exhaustiveMapExtensionType3(ExtensionTypeMap<int, A> map) {
return switch (map) {
Map() => 0,
{1: _} => 1,
// ^^
// [analyzer] HINT.UNREACHABLE_SWITCH_CASE
{2: _} => 2,
// ^^
// [analyzer] HINT.UNREACHABLE_SWITCH_CASE
};
}
exhaustiveMapMethod(ExtensionTypeMap<int, A> map) {
return switch (map) {
ExtensionTypeMap(:A Function(int) method) => 0,
};
}
exhaustiveMapGetter(ExtensionTypeMap<int, A> map) {
return switch (map) {
ExtensionTypeMap(:B getter) => 0,
ExtensionTypeMap(:C getter) => 1,
};
}
exhaustiveMapGenericMethod(ExtensionTypeMap<int, A> map) {
return switch (map) {
ExtensionTypeMap(
:void Function<X>(int, A, void Function(X)) genericMethod) => 0,
};
}
exhaustiveMapField(ExtensionTypeMap<int, A> map) {
return switch (map) {
ExtensionTypeMap(:Map<int, A> it) => 0,
};
}
main() {
Expect.equals(0, exhaustiveListExtensionType(ExtensionTypeList([])));
Expect.equals(2, exhaustiveListExtensionType(ExtensionTypeList([C()])));
Expect.equals(0, exhaustiveMapExtensionType1(ExtensionTypeMap({0: B()})));
Expect.equals(0, exhaustiveMapExtensionType2(ExtensionTypeMap({})));
Expect.equals(1, exhaustiveMapExtensionType2(ExtensionTypeMap({0: B()})));
Expect.equals(0, exhaustiveMapExtensionType3(ExtensionTypeMap({0: B()})));
Expect.equals(0, exhaustiveMapMethod(ExtensionTypeMap({0: B()})));
Expect.equals(0, exhaustiveMapGetter(ExtensionTypeMap({0: B()})));
Expect.equals(1, exhaustiveMapGetter(ExtensionTypeMap({0: C()})));
Expect.equals(0, exhaustiveMapGenericMethod(ExtensionTypeMap({0: B()})));
Expect.equals(0, exhaustiveMapField(ExtensionTypeMap({0: B()})));
}