typedef ContraFunction<T> = void Function(T);
typedef InvFunction<T> = T Function(T);
class Contravariant<in T> {}
class Invariant<inout T> {}
class A<in T, out U, V> {
  final void Function(T) field = null;
  void method(T t, void Function(U) u, V v) {}
  void method2(T x, [T y]) {}
  void set x(T t) {}
  Map<U, Contravariant<V>> get mapContra => new Map<U, Contravariant<V>>();
  Map<U, ContraFunction<V>> get mapContraFn => new Map<U, ContraFunction<V>>();
  Map<U, Invariant<V>> get mapInv => new Map<U, Invariant<V>>();
  Map<U, InvFunction<V>> get mapInvFn => new Map<U, InvFunction<V>>();
}
class B<inout T> {
  T x;
  T method(T x) => x;
  void set y(T x) {}
}
class C<in T> {
  final void Function(T) field = null;
  void method(T x, [T y]) {}
  void set x(T t) {}
}
abstract class D<T> {
  int method(T x);
}
class E<inout T> {
  final void Function(T) f;
  E(this.f);
  int method(T x) {}
}
class F<inout T> extends E<T> implements D<T> {
  F(void Function(T) f) : super(f);
}
class NoSuchMethod<inout T> implements B<T> {
  noSuchMethod(_) => 3;
}
main() {}
expect(expected, actual) {}
