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

abstract class A extends core::Object {
  field core::int* foo = null;
  synthetic constructor •() → self::A*
    : super core::Object::•()
    ;
}
class B extends core::Object implements self::A {
  synthetic constructor •() → self::B*
    : super core::Object::•()
    ;
  method noSuchMethod(core::Invocation* i) → dynamic {
    self::count = self::count.{core::num::+}(1);
    return null;
  }
  no-such-method-forwarder get foo() → core::int*
    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} core::int*;
  no-such-method-forwarder set foo(core::int* value) → void
    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
}
abstract class _C&Object&B extends core::Object implements self::B {
  const synthetic constructor •() → self::_C&Object&B*
    : super core::Object::•()
    ;
  method noSuchMethod(core::Invocation* i) → dynamic {
    self::count = self::count.{core::num::+}(1);
    return null;
  }
}
class C extends self::_C&Object&B {
  synthetic constructor •() → self::C*
    : super self::_C&Object&B::•()
    ;
  get foo() → core::int*
    return 42;
  set foo(core::int* value) → void {}
}
static field core::int* count = 0;
static method main() → dynamic {
  self::C* c = new self::C::•();
  if(!c.{self::C::foo}.{core::num::==}(42)) {
    throw "Value mismatch: c.foo != 42.";
  }
  c.{self::C::foo} = 43;
  if(!self::count.{core::num::==}(0)) {
    throw "Value mismatch: count != 0";
  }
}

constants  {
  #C1 = #foo
  #C2 = <core::Type*>[]
  #C3 = <dynamic>[]
  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
  #C5 = #foo=
}
