| // 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. |
| // @dart=2.9 |
| /*@testedFeatures=inference*/ |
| library test; |
| |
| class DartType {} |
| |
| typedef void Asserter<T>(T type); |
| typedef Asserter<T> AsserterBuilder<S, T>(S arg); |
| |
| Asserter<DartType> _isInt; |
| Asserter<DartType> _isString; |
| |
| abstract class C { |
| static AsserterBuilder<List<Asserter<DartType>>, DartType> assertBOf; |
| static AsserterBuilder<List<Asserter<DartType>>, DartType> get assertCOf => |
| null; |
| |
| AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf; |
| AsserterBuilder<List<Asserter<DartType>>, DartType> get assertDOf; |
| |
| method(AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) { |
| /*@target=C.assertAOf*/ assertAOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| assertBOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| assertCOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| /*@target=C.assertDOf*/ assertDOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| assertEOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| } |
| } |
| |
| abstract class G<T> { |
| AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf; |
| AsserterBuilder<List<Asserter<DartType>>, DartType> get assertDOf; |
| |
| method(AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) { |
| /*@target=G.assertAOf*/ assertAOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| this. /*@target=G.assertAOf*/ assertAOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| this. /*@target=G.assertDOf*/ assertDOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| assertEOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| } |
| } |
| |
| AsserterBuilder<List<Asserter<DartType>>, DartType> assertBOf; |
| AsserterBuilder<List<Asserter<DartType>>, DartType> get assertCOf => null; |
| |
| test() { |
| AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf; |
| assertAOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| assertBOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| assertCOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| C.assertBOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| C.assertCOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| |
| C c; |
| c. /*@target=C.assertAOf*/ assertAOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| c. /*@target=C.assertDOf*/ assertDOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| |
| G<int> g; |
| g. /*@target=G.assertAOf*/ assertAOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| g. /*@target=G.assertDOf*/ assertDOf( |
| /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]); |
| } |
| |
| main() {} |