blob: c9a53997e14986b76bbaabaef6c1474fad7f147f [file] [log] [blame]
// Copyright (c) 2021, 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.
/// @assertion We allow TypeName.name and TypeName<typeArgs>.name, when not
/// followed by a type argument list or function argument list, as expressions
/// which creates tear-offs of the constructor TypeName.name. The TypeName can
/// refer to a class declaration or to a type alias declaration which aliases a
/// class.
///
/// typedef ListList<T> = List<List<T>>;
/// const filledList = List.filled; // List<T> Function<T>(int, T)
/// const filledIntList = List<int>.filled; // List<int> Function(int, int)
/// const filledListList = ListList.filled; // List<List<T>> Function<T>(int, T)
/// const filledIntListList = ListList<int>.filled; // List<List<int>> Function(int, int)
///
/// @description Checks an example from the specification
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs
import "../../Utils/expect.dart";
typedef ListList<T> = List<List<T>>;
typedef Func1 = List<T> Function<T>(int i, T t);
typedef List<int> Func2(int i1, int i2);
typedef Func3 = List<List<T>> Function<T>(int i, List<T> t);
typedef List<List<int>> Func4(int i1, List<int> i2);
main() {
const filledList = List.filled; // List<T> Function<T>(int, T)
Expect.isTrue(filledList is Func1);
Expect.runtimeIsType<Func1>(filledList);
const filledIntList = List<int>.filled; // List<int> Function(int, int)
Expect.isTrue(filledIntList is Func2);
Expect.runtimeIsType<Func2>(filledIntList);
const filledListList = ListList.filled; // List<List<T>> Function<T>(int, T)
Expect.isTrue(filledListList is Func3);
Expect.runtimeIsType<Func3>(filledListList);
const filledIntListList = ListList<int>.filled; // List<List<int>> Function(int, int)
Expect.isTrue(filledIntListList is Func4);
}