| // Copyright (c) 2020, 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. |
| // |
| // dart2jsOptions=-O4 |
| |
| // Regression test for passing type parameters through call-through stub. |
| // |
| // We use an abstract class with two implementations to avoid the optimizer |
| // 'inlining' the call-through stub, so we are testing that the stub itself |
| // passes through the type parameters. |
| |
| import 'package:expect/expect.dart'; |
| |
| abstract class AAA { |
| dynamic get foo; |
| } |
| |
| class B1 implements AAA { |
| final dynamic foo; |
| B1(this.foo); |
| } |
| |
| class B2 implements AAA { |
| final dynamic _arr; |
| B2(foo) : _arr = [foo]; |
| dynamic get foo => _arr.first; |
| } |
| |
| class B3 implements AAA { |
| final dynamic __foo; |
| B3(this.__foo); |
| dynamic get _foo => __foo; |
| dynamic get foo => _foo; |
| } |
| |
| @pragma('dart2js:noInline') |
| test1<T>(AAA a, String expected) { |
| // call-through getter 'foo' with one type argument. |
| Expect.equals(expected, a.foo<T>()); |
| } |
| |
| @pragma('dart2js:noInline') |
| test2<U, V>(AAA a, String expected) { |
| // call-through getter 'foo' with two type arguments. |
| Expect.equals(expected, a.foo<U, V>()); |
| } |
| |
| main() { |
| test1<int>(B1(<P>() => '$P'), 'int'); |
| test1<num>(B2(<Q>() => '$Q'), 'num'); |
| test1<double>(B3(<R>() => '$R'), 'double'); |
| |
| test2<int, num>(B1(<A, B>() => '$A $B'), 'int num'); |
| test2<num, int>(B2(<X, Y>() => '$X $Y'), 'num int'); |
| test2<double, String>(B3(<C, D>() => '$C $D'), 'double String'); |
| } |