// 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() {}
