mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 00:29:48 +00:00
407428311f
Change-Id: I277a4f29d39c2c4d2669931b5f4837db65589167 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149522 Auto-Submit: Kevin Moore <kevmoo@google.com> Commit-Queue: Leaf Petersen <leafp@google.com> Reviewed-by: Leaf Petersen <leafp@google.com>
123 lines
4.1 KiB
Dart
123 lines
4.1 KiB
Dart
// 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.
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
// Tests the syntax of extension methods, and that the extensions are
|
|
// invocable, and that type variables are bound correctly.
|
|
|
|
// There are no extension *conflicts*.
|
|
// For each invocation, there is exactly one extension member in scope
|
|
// which applies.
|
|
|
|
// Target types.
|
|
class Unnamed {}
|
|
|
|
class Named {}
|
|
|
|
class UnnamedGeneric<T> {}
|
|
|
|
class NamedGeneric<T> {}
|
|
|
|
String str(String name, Object? object) =>
|
|
"$name(${object == null ? "null" : "non-null"})";
|
|
|
|
// Unnamed local extension.
|
|
extension on Unnamed? {
|
|
String get name => str("unnamed", this);
|
|
}
|
|
|
|
extension NamedExt on Named? {
|
|
String get name => str("named", this);
|
|
}
|
|
|
|
extension<T> on UnnamedGeneric<T>? {
|
|
String get name => str("unnamed generic", this);
|
|
List<T> get list => <T>[];
|
|
}
|
|
|
|
extension NamedGenericExt<T> on NamedGeneric<T>? {
|
|
String get name => str("named generic", this);
|
|
List<T> get list => <T>[];
|
|
}
|
|
|
|
extension General on Object? {
|
|
String get generalName => str("general", this);
|
|
}
|
|
|
|
extension GeneralGeneric<T> on T {
|
|
String get generalGenericName => str("general generic", this);
|
|
List<T> get generalList => <T>[];
|
|
}
|
|
|
|
main() {
|
|
// Unnamed.
|
|
Unnamed unnamed = Unnamed();
|
|
Unnamed? unnamedNull = null;
|
|
|
|
Expect.equals("unnamed(non-null)", unnamed.name);
|
|
Expect.equals("unnamed(null)", unnamedNull.name);
|
|
|
|
Expect.equals("general(non-null)", unnamed.generalName);
|
|
Expect.equals("general(null)", unnamedNull.generalName);
|
|
|
|
Expect.equals("general generic(non-null)", unnamed.generalGenericName);
|
|
Expect.equals("general generic(null)", unnamedNull.generalGenericName);
|
|
Expect.type<List<Unnamed>>(unnamed.generalList);
|
|
Expect.type<List<Unnamed?>>(unnamedNull.generalList);
|
|
|
|
// Named.
|
|
Named named = Named();
|
|
Named? namedNull = null;
|
|
|
|
Expect.equals("named(non-null)", named.name);
|
|
Expect.equals("named(null)", namedNull.name);
|
|
|
|
Expect.equals("general(non-null)", named.generalName);
|
|
Expect.equals("general(null)", namedNull.generalName);
|
|
|
|
Expect.equals("general generic(non-null)", named.generalGenericName);
|
|
Expect.equals("general generic(null)", namedNull.generalGenericName);
|
|
Expect.type<List<Named>>(named.generalList);
|
|
Expect.type<List<Named?>>(namedNull.generalList);
|
|
|
|
// Unnamed Generic.
|
|
UnnamedGeneric<num> unnamedGeneric = UnnamedGeneric<int>();
|
|
UnnamedGeneric<num>? unnamedGenericNull = null;
|
|
|
|
Expect.equals("unnamed generic(non-null)", unnamedGeneric.name);
|
|
Expect.equals("unnamed generic(null)", unnamedGenericNull.name);
|
|
Expect.type<List<num>>(unnamedGeneric.list);
|
|
Expect.notType<List<int>>(unnamedGeneric.list);
|
|
Expect.type<List<num>>(unnamedGenericNull.list);
|
|
Expect.notType<List<int>>(unnamedGenericNull.list);
|
|
|
|
Expect.equals("general(non-null)", unnamedGeneric.generalName);
|
|
Expect.equals("general(null)", unnamedGenericNull.generalName);
|
|
|
|
Expect.equals("general generic(non-null)", unnamedGeneric.generalGenericName);
|
|
Expect.equals("general generic(null)", unnamedGenericNull.generalGenericName);
|
|
Expect.type<List<UnnamedGeneric<num>>>(unnamedGeneric.generalList);
|
|
Expect.type<List<UnnamedGeneric<num>?>>(unnamedGenericNull.generalList);
|
|
|
|
// Named Generic.
|
|
NamedGeneric<num> namedGeneric = NamedGeneric<int>();
|
|
NamedGeneric<num>? namedGenericNull = null;
|
|
|
|
Expect.equals("named generic(non-null)", namedGeneric.name);
|
|
Expect.equals("named generic(null)", namedGenericNull.name);
|
|
Expect.type<List<num>>(namedGeneric.list);
|
|
Expect.notType<List<int>>(namedGeneric.list);
|
|
Expect.type<List<num>>(namedGenericNull.list);
|
|
Expect.notType<List<int>>(namedGenericNull.list);
|
|
|
|
Expect.equals("general(non-null)", namedGeneric.generalName);
|
|
Expect.equals("general(null)", namedGenericNull.generalName);
|
|
|
|
Expect.equals("general generic(non-null)", namedGeneric.generalGenericName);
|
|
Expect.equals("general generic(null)", namedGenericNull.generalGenericName);
|
|
Expect.type<List<NamedGeneric<num>>>(namedGeneric.generalList);
|
|
Expect.type<List<NamedGeneric<num>?>>(namedGenericNull.generalList);
|
|
}
|