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

  import "org-dartlang-test:///main_lib2.dart";

  static method main() → dynamic {
    mai::method();
  }
}
library from "org-dartlang-test:///main_lib1.dart" as mai2 {

  class SuperClass extends dart.core::Object {
    synthetic constructor •() → mai2::SuperClass*
      : super dart.core::Object::•()
      ;
    method method(covariant-by-declaration dart.core::int* i) → void {}
    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
  }
  class Mixin extends dart.core::Object {
    synthetic constructor •() → mai2::Mixin*
      : super dart.core::Object::•()
      ;
    method method(dart.core::num* i) → void {}
    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 _Class&SuperClass&Mixin = mai2::SuperClass with mai2::Mixin /*isAnonymousMixin*/  {
    synthetic constructor •() → mai2::_Class&SuperClass&Mixin*
      : super mai2::SuperClass::•()
      ;
    forwarding-stub method method(covariant-by-declaration dart.core::num* i) → void
      return super.{mai2::Mixin::method}(i);
  }
  class Class extends mai2::_Class&SuperClass&Mixin {
    synthetic constructor •() → mai2::Class*
      : super mai2::_Class&SuperClass&Mixin::•()
      ;
  }
}
library from "org-dartlang-test:///main_lib2.dart" as mai {

  import "org-dartlang-test:///main_lib1.dart";

  class SubClass extends mai2::Class {
    synthetic constructor •() → mai::SubClass*
      : super mai2::Class::•()
      ;
  }
  static method method() → dynamic
    return new mai::SubClass::•().{mai2::_Class&SuperClass&Mixin::method}(0){(dart.core::num*) →* void};
}
