library private;
import self as self;
import "dart:core" as core;
import "private_module.dart" as pri;

import "org-dartlang-testcase:///private_module.dart" show Fisk;

abstract class Foo extends core::Object {
  synthetic constructor •() → self::Foo
    : super core::Object::•()
    ;
  method noSuchMethod(core::Invocation invocation) → dynamic
    return 42;
}
class Bar extends self::Foo implements pri::Fisk {
  synthetic constructor •() → self::Bar
    : super self::Foo::•()
    ;
  no-such-method-forwarder method _hest() → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol, dynamic>(#C4)));
}
class Baz extends self::Foo implements pri::Fisk {
  synthetic constructor •() → self::Baz
    : super self::Foo::•()
    ;
  method _hest() → dynamic
    return null;
  no-such-method-forwarder method _hest() → void
    return throw{for-error-handling} core::NoSuchMethodError::withInvocation(this, new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol, dynamic>(#C4)));
}
static method main() → dynamic {}

library private_module;
import self as pri;
import "dart:core" as core;

abstract class Fisk extends core::Object {
  synthetic constructor •() → pri::Fisk
    : super core::Object::•()
    ;
  abstract method _hest() → void;
}
static method main() → dynamic {}

constants  {
  #C1 = #org-dartlang-testcase:///private.dart::_hest
  #C2 = <core::Type>[]
  #C3 = <dynamic>[]
  #C4 = <core::Symbol, dynamic>{}
}
