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

abstract class A extends core::Object {
  field core::int* foo;
  synthetic constructor •() → self::A*
    ;
}
abstract class B extends core::Object implements self::A {
  synthetic constructor •() → self::B*
    ;
  get foo() → core::int*
    ;
  method noSuchMethod(core::Invocation* i) → dynamic
    ;
}
class C extends self::B {
  synthetic constructor •() → self::C*
    ;
  no-such-method-forwarder set foo(core::int* value) → void
    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
}
abstract class D extends core::Object implements self::A {
  synthetic constructor •() → self::D*
    ;
  set foo(core::int* value) → void
    ;
  method noSuchMethod(core::Invocation* i) → dynamic
    ;
}
class E extends self::D {
  synthetic constructor •() → self::E*
    ;
  no-such-method-forwarder get foo() → core::int*
    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} core::int*;
}
static method expectTypeError(() →* dynamic callback) → void
  ;
static method main() → dynamic
  ;
