| // 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; |
| } |