|  | // 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. | 
|  |  | 
|  | // @dart = 2.7 | 
|  |  | 
|  | /*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(); | 
|  | } |