main = <No Member>;
library from "org-dartlang-test:///main.dart" as main {

  abstract class A extends dart.core::Object {
    synthetic constructor •() → main::A*
      : super dart.core::Object::•()
      ;
    method a() → dynamic {
      dart.core::print("Class A method a");
    }
    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
  }
  abstract class B extends main::A /*isMixinDeclaration*/  {
    method b() → dynamic {
      dart.core::print("Class A method b");
    }
  }
  abstract class _C&A&B extends dart.core::Object implements main::A, main::B /*isAnonymousMixin*/  {
    synthetic constructor •() → main::_C&A&B*
      : super dart.core::Object::•()
      ;
    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
  }
  abstract class C extends main::_C&A&B /*isMixinDeclaration*/  {
    method c() → dynamic {
      dart.core::print("Class C method c");
    }
  }
  abstract class _D&A&B extends main::A implements main::B /*isAnonymousMixin,isEliminatedMixin*/  {
    synthetic constructor •() → main::_D&A&B*
      : super main::A::•()
      ;
    method b() → dynamic {
      dart.core::print("Class A method b");
    }
  }
  abstract class _D&A&B&C extends main::_D&A&B implements main::C /*isAnonymousMixin,isEliminatedMixin*/  {
    synthetic constructor •() → main::_D&A&B&C*
      : super main::_D&A&B::•()
      ;
    method c() → dynamic {
      dart.core::print("Class C method c");
    }
  }
  class D extends main::_D&A&B&C {
    synthetic constructor •() → main::D*
      : super main::_D&A&B&C::•()
      ;
    method d() → dynamic {
      dart.core::print("Class D method d");
    }
  }
  static method topLevelA() → dynamic {
    dart.core::print("top level method topLevelA");
  }
  static method topLevelB() → dynamic {
    dart.core::print("top level method topLevelB");
  }
  static method topLevelC() → dynamic {
    dart.core::print("top level method topLevelC");
  }
  static method topLevelD() → dynamic {
    dart.core::print("top level method topLevelD");
  }
}
