// 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.

// @dart=2.6

/*library: nnbd=false*/

import 'dart:async';

/*class: A:A,Object*/
abstract class A {
  /*member: A.method:Object* Function(Object*)**/
  Object method(Object a);
}

/*class: B:B,Object*/
abstract class B {
  /*member: B.method:dynamic Function(dynamic)**/
  dynamic method(dynamic a);
}

/*class: C:C,Object*/
abstract class C {
  /*member: C.method:void Function(void)**/
  void method(void a);
}

/*class: D:D,Object*/
abstract class D {
  /*member: D.method:FutureOr<dynamic>* Function(FutureOr<dynamic>*)**/
  FutureOr method(FutureOr a);
}

/*class: E1:A,B,C,E1,Object*/
abstract class E1 implements A, B, C {
  /*member: E1.method:Object* Function(Object*)**/
}

/*class: E2:A,B,E2,Object*/
abstract class E2 implements A, B {
  /*member: E2.method:Object* Function(Object*)**/
}

/*class: E3:B,C,E3,Object*/
abstract class E3 implements B, C {
  /*member: E3.method:dynamic Function(dynamic)**/
}

/*class: E4:A,C,E4,Object*/
abstract class E4 implements A, C {
  /*member: E4.method:Object* Function(Object*)**/
}

/*class: E5:A,D,E5,Object*/
abstract class E5 implements A, D {
  /*member: E5.method:Object* Function(Object*)**/
}

/*class: E6:A,D,E6,Object*/
abstract class E6 implements D, A {
  /*member: E6.method:FutureOr<dynamic>* Function(FutureOr<dynamic>*)**/
}

/*class: F:F,Object*/
abstract class F {
  /*member: F.method:void Function(int*)**/
  void method(int a);
}

/*class: G1:A,C,F,G1,Object*/
abstract class G1 implements A, C, F {
  /*member: G1.method:Object* Function(Object*)**/
}

/*class: G2:A,C,F,G2,Object*/
abstract class G2 implements A, F, C {
  /*member: G2.method:Object* Function(Object*)**/
}

/*class: G3:A,C,F,G3,Object*/
abstract class G3 implements C, A, F {
  /*member: G3.method:void Function(void)**/
}

/*class: G4:A,C,F,G4,Object*/
abstract class G4 implements C, F, A {
  /*member: G4.method:void Function(void)**/
}
