| // Copyright (c) 2013, 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. | 
 |  | 
 | // TODO(51557): Decide if the mixins being applied in this test should be | 
 | // "mixin", "mixin class" or the test should be left at 2.19. | 
 | // @dart=2.19 | 
 |  | 
 | library mixin_members_test; | 
 |  | 
 | import "dart:mirrors"; | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | import 'stringify.dart'; | 
 |  | 
 | abstract class Fooer { | 
 |   foo1(); | 
 | } | 
 |  | 
 | class S implements Fooer { | 
 |   foo1() {} | 
 |   foo2() {} | 
 | } | 
 |  | 
 | class M1 { | 
 |   bar1() {} | 
 |   bar2() {} | 
 | } | 
 |  | 
 | class M2 { | 
 |   baz1() {} | 
 |   baz2() {} | 
 | } | 
 |  | 
 | class C extends S with M1, M2 {} | 
 |  | 
 | membersOf(ClassMirror cm) { | 
 |   var result = new Map<Symbol, dynamic>(); | 
 |   cm.declarations.forEach((k, v) { | 
 |     if (v is MethodMirror && !v.isConstructor) result[k] = v; | 
 |     if (v is VariableMirror) result[k] = v; | 
 |   }); | 
 |   return result; | 
 | } | 
 |  | 
 | main() { | 
 |   ClassMirror cm = reflectClass(C); | 
 |   ClassMirror sM1M2 = cm.superclass!; | 
 |   ClassMirror sM1 = sM1M2.superclass!; | 
 |   ClassMirror s = sM1.superclass!; | 
 |   expect('{}', membersOf(cm)); | 
 |   expect( | 
 |       '[s(baz1), s(baz2)]', | 
 |       // TODO(ahe): Shouldn't have to sort. | 
 |       sort(membersOf(sM1M2).keys), | 
 |       '(S with M1, M2).members'); | 
 |   expect('[s(M2)]', simpleNames(sM1M2.superinterfaces), | 
 |       '(S with M1, M2).superinterfaces'); | 
 |   expect( | 
 |       '[s(bar1), s(bar2)]', | 
 |       // TODO(ahe): Shouldn't have to sort. | 
 |       sort(membersOf(sM1).keys), | 
 |       '(S with M1).members'); | 
 |   expect('[s(M1)]', simpleNames(sM1.superinterfaces), | 
 |       '(S with M1).superinterfaces'); | 
 |   expect( | 
 |       '[s(foo1), s(foo2)]', | 
 |       // TODO(ahe): Shouldn't have to sort. | 
 |       sort(membersOf(s).keys), | 
 |       's.members'); | 
 |   expect('[s(Fooer)]', simpleNames(s.superinterfaces), 's.superinterfaces'); | 
 |   Expect.equals(s, reflectClass(S)); | 
 | } |