blob: 18113c6e4411beb9b1be69746afb5b022ecdc7a1 [file] [log] [blame]
// 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.
/*@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() {}