library;
import self as self;
import "stub_or_not_lib1.dart" as stu;
import "stub_or_not_lib2.dart" as stu2;

import "org-dartlang-testcase:///stub_or_not_lib1.dart";

class ProblemClass extends stu::Foo {
  synthetic constructor •() → self::ProblemClass*
    : super stu::Foo::•()
    ;
  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
}
static method main() → dynamic {}

library;
import self as stu;
import "dart:core" as core;
import "stub_or_not_lib2.dart" as stu2;

import "org-dartlang-testcase:///stub_or_not_lib2.dart";

abstract class Qux extends core::Object implements stu2::EventFileA {
  synthetic constructor •() → stu::Qux*
    : super core::Object::•()
    ;
  method handleEvent(covariant stu2::EvenFileB* entry) → void {}
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class EvenFileBPrime extends stu2::EvenFileB {
  synthetic constructor •() → stu::EvenFileBPrime*
    : super stu2::EvenFileB::•()
    ;
}
abstract class Baz extends stu::Qux {
  synthetic constructor •() → stu::Baz*
    : super stu::Qux::•()
    ;
  method handleEvent(covariant stu::EvenFileBPrime* entry) → void {}
}
abstract class Foo extends stu::Baz implements stu::Qux {
  synthetic constructor •() → stu::Foo*
    : super stu::Baz::•()
    ;
  abstract forwarding-stub method handleEvent(covariant stu2::EvenFileB* entry) → void;
}

library;
import self as stu2;
import "dart:core" as core;

abstract class EventFileA extends core::Object {
  synthetic constructor •() → stu2::EventFileA*
    : super core::Object::•()
    ;
  abstract method handleEvent(stu2::EvenFileB* entry) → void;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class EvenFileB extends core::Object {
  synthetic constructor •() → stu2::EvenFileB*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
