mirror of
https://github.com/dart-lang/sdk
synced 2024-09-19 14:43:32 +00:00
fdbc6688f1
BUG= R=sigmund@google.com Review-Url: https://codereview.chromium.org/2639733004 .
81 lines
2.4 KiB
Dart
81 lines
2.4 KiB
Dart
// Copyright (c) 2017, 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";
|
|
|
|
typedef String F(String returns, String arguments);
|
|
F fn;
|
|
|
|
String form1(String returns, String arguments) => '$arguments => $returns';
|
|
String form2(String returns, String arguments) => '$returns Function$arguments';
|
|
|
|
F detectForm() {
|
|
var s = main.runtimeType.toString();
|
|
if (s.contains('=>')) return form1;
|
|
if (s.contains('Function')) return form2;
|
|
Expect.fail('"$s" contains neither "=>" nor "Function"');
|
|
}
|
|
|
|
main() {
|
|
fn = detectForm();
|
|
|
|
// Types that do not use class names - these can be checked on dart2js in
|
|
// minified mode.
|
|
|
|
check(fn('dynamic', '()'), main); // Top-level tear-off.
|
|
check(fn('void', '()'), Xyzzy.foo); // Class static member tear-off.
|
|
check(fn('void', '(dynamic)'), [].add); // Instance tear-off.
|
|
check(fn('dynamic', '()'), ()=>1); // closure.
|
|
|
|
var s = new Xyzzy().runtimeType.toString();
|
|
if (s.length <= 3) return; // dart2js --minify has minified names.
|
|
|
|
Expect.equals('Xyzzy', s, 'runtime type of plain class prints as class name');
|
|
|
|
check(fn('void', '(String, dynamic)'), check);
|
|
|
|
// Class static member tear-offs.
|
|
check(fn('String', '(String, [String, dynamic])'), Xyzzy.opt);
|
|
check(fn('String', '(String, {String a, dynamic b})'), Xyzzy.nam);
|
|
|
|
// Instance method tear-offs.
|
|
check(fn('void', '(String)'), <String>[].add);
|
|
check(fn('void', '(int)'), <int>[].add);
|
|
|
|
check(fn('String', '(int)'), new G<String, int>().foo);
|
|
|
|
// Instance method with function parameter.
|
|
var string2int = fn('int', '(String)');
|
|
check(fn('String', '($string2int)'), new G<String, int>().moo);
|
|
|
|
// Closures.
|
|
String localFunc(String a, String b) => a + b;
|
|
void localFunc2(int a) { print(a); }
|
|
Expect.isTrue(localFunc is F);
|
|
check(fn('String', '(String, String)'), localFunc);
|
|
check(fn('void', '(int)'), localFunc2);
|
|
}
|
|
|
|
void check(String text, var thing) {
|
|
var type = thing.runtimeType.toString();
|
|
if (type == text) return;
|
|
Expect.fail("""
|
|
Type print string does not match expectation
|
|
Expected: '$text'
|
|
Actual: '$type'
|
|
""");
|
|
}
|
|
|
|
|
|
class Xyzzy {
|
|
static void foo() {}
|
|
static String opt(String x, [String a, b]) {}
|
|
static String nam(String x, {String a, b}) {}
|
|
}
|
|
|
|
class G<U, V> {
|
|
U foo(V x) => null;
|
|
U moo(V f(U x)) => null;
|
|
}
|