// Copyright (c) 2019, 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.

/*member: A.:invoke*/
class A {
  /*member: A.method1:invoke*/
  method1() {}

  method2() {}

  /*member: A.method4:invoke*/
  method4() {}

  /*member: A.getter:read*/
  get getter => 42;

  set setter(_) {}
}

/*member: B.:invoke*/
class B {
  method1() {}
  method2() {}

  /*member: B.method5:invoke*/
  method5() {}
  get getter => 42;

  /*member: B.setter=:write*/
  set setter(_) {}
}

/*member: C.:invoke*/
class C extends A {
  /*member: C.method1:invoke*/
  @override
  method1() {}

  /*member: B.method2:invoke*/
  @override
  method2() {}

  @override
  method4() {}

  /*member: C.getter:read*/
  @override
  get getter => 42;

  @override
  set setter(_) {}
}

/*member: D.:invoke*/
class D implements B {
  @override
  method1() {}

  /*member: D.method2:invoke*/
  @override
  method2() {}

  @override
  method5() {}

  @override
  get getter => 42;

  /*member: D.setter=:write*/
  @override
  set setter(_) {}
}

class E implements A {
  @override
  method1() {}

  @override
  method2() {}

  @override
  method4() {}

  @override
  get getter => 42;

  @override
  set setter(_) {}
}

class F extends B {
  @override
  method1() {}

  @override
  method2() {}

  @override
  method5() {}

  @override
  get getter => 42;

  @override
  set setter(_) {}
}

class G {
  /*member: G.method1:invoke*/
  method1() {}
  method2() {}
  method4() {}

  /*member: G.getter:read*/
  get getter => 42;
  set setter(_) {}
}

/*member: H.:invoke*/
class H extends Object with G implements A {}

/*member: I.:invoke*/
class I {
  /*member: I.method1:invoke*/
  method1() {}
  method2() {}
  method4() {}

  /*member: I.getter:read*/
  get getter => 42;
  set setter(_) {}
}

/*member: J.:invoke*/
class J extends I implements A {}

class K {
  /*member: K.method1:invoke*/
  method1() {}
  method2() {}

  /*member: K.getter:read*/
  get getter => 42;
  set setter(_) {}
}

class L = Object with K;
class L2 = Object with L;

/*member: M.:invoke*/
class M extends L {}

/*member: M2.:invoke*/
class M2 extends L2 {}

/*member: N.:invoke*/
class N {
  method1() {}
  get getter => 42;
  set setter(_) {}
}

abstract class O extends N {}

/*member: P.:invoke*/
class P implements O {
  /*member: P.method1:invoke*/
  @override
  method1() {}

  /*member: P.getter:read*/
  @override
  get getter => 42;

  /*member: P.setter=:write*/
  @override
  set setter(_) {}
}

/*member: Q.:invoke*/
class Q {
  /*member: Q.method3:invoke*/
  method3() {}
}

/*member: R.:invoke*/
class R extends Q {}

/*member: Class1a.:invoke*/
class Class1a {
  /*member: Class1a.call:invoke*/
  call(a, b, c) {} // Call structure only used in Class1a and Class2b.
}

/*member: Class1b.:invoke*/
class Class1b {
  call(a, b, c) {}
}

/*member: Class2.:invoke*/
class Class2 {
  /*member: Class2.c:init,invoke,read=static*/
  Class1a c;
}

/*member: main:invoke*/
main() {
  method1();
  method2();
}

/*member: method1:invoke*/
@pragma('dart2js:disableFinal')
method1() {
  A a = new A();
  B b = new B();
  a.method1();
  a.getter;
  b.method2();
  b.setter = 42;
  new C();
  new D();
  new H();
  new J();
  new M().method1();
  new M2().getter;
  new N();
  O o = new P();
  o.method1();
  o.getter;
  o.setter = 42;
  R r;
  r.method3();
  r = new R(); // Create R after call.
  new Class1a();
  new Class1b();
  new Class2().c(0, 1, 2);
}

/*member: method2:invoke*/
method2() {
  A a = new A();
  B b = new B();
  a.method4();
  b.method5();
}
