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

  class FooEntry extends dart.core::Object {
    synthetic constructor •() → lib::FooEntry
      : super dart.core::Object::•()
      ;
  }
  class BarEntry extends lib::FooEntry {
    synthetic constructor •() → lib::BarEntry
      : super lib::FooEntry::•()
      ;
  }
  abstract class FooTarget extends dart.core::Object {
    synthetic constructor •() → lib::FooTarget
      : super dart.core::Object::•()
      ;
    abstract method hello(lib::FooEntry entry) → void;
  }
  abstract class Baz extends dart.core::Object implements lib::FooTarget {
    synthetic constructor •() → lib::Baz
      : super dart.core::Object::•()
      ;
    method hello(covariant-by-declaration lib::FooEntry entry) → void {}
  }
  abstract class MyMixin extends lib::Baz /*isMixinDeclaration*/  {
  }
  abstract class Qux extends lib::Baz {
    synthetic constructor •() → lib::Qux
      : super lib::Baz::•()
      ;
    method hello(covariant-by-declaration lib::BarEntry entry) → void {}
  }
  abstract class _Quux&Qux&MyMixin extends lib::Qux implements lib::MyMixin /*isAnonymousMixin,isEliminatedMixin*/  {
    synthetic constructor •() → lib::_Quux&Qux&MyMixin
      : super lib::Qux::•()
      ;
    abstract member-signature method hello(covariant-by-declaration lib::FooEntry entry) → void; -> lib::Baz::hello
  }
  class Quux extends lib::_Quux&Qux&MyMixin {
    synthetic constructor •() → lib::Quux
      : super lib::_Quux&Qux&MyMixin::•()
      ;
  }
}
library from "org-dartlang-test:///main.dart" as main {

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

  class Test extends main::Test2 {
    synthetic constructor •() → main::Test
      : super main::Test2::•()
      ;
    method world() → lib::Quux
      return throw "";
  }
  abstract class Test2 extends dart.core::Object {
    synthetic constructor •() → main::Test2
      : super dart.core::Object::•()
      ;
    abstract method world() → lib::Baz;
  }
}
