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

class Base extends core::Object {
  synthetic constructor •() → self::Base*
    : super core::Object::•()
    ;
  no-such-method-forwarder set push(core::int* x) → void
    return this.{self::Base::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
  no-such-method-forwarder set float(covariant core::int* x) → void
    return this.{self::Base::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
  method noSuchMethod(core::Invocation* i) → dynamic
    return core::print("${this.{core::Object::runtimeType}}: ${i.{core::Invocation::positionalArguments}.{core::List::[]}(0)}");
}
class Me extends self::Base {
  synthetic constructor •() → self::Me*
    : super self::Base::•()
    ;
}
class You extends self::Base {
  synthetic constructor •() → self::You*
    : super self::Base::•()
    ;
  no-such-method-forwarder set push(core::num* x) → void
    return this.{self::Base::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
  no-such-method-forwarder set float(covariant core::num* x) → void
    return this.{self::Base::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
}
static method main() → dynamic {
  core::List<self::Base*>* list = <self::Base*>[new self::Me::•(), new self::You::•()];
  for (self::Base* baba in list) {
    baba.{self::Base::push} = 0;
    baba.{self::Base::float} = 1;
    if(baba is self::You*) {
      baba{self::You*}.{self::You::push} = 2.3;
      baba{self::You*}.{self::You::float} = 4.5;
    }
    try {
      (baba as dynamic).push = 6.7;
      baba is self::You* || (throw "Fail!");
    }
    on core::TypeError* catch(no-exception-var) {
      baba is self::Me* || (throw "Fail!");
    }
    try {
      (baba as dynamic).float = 8.9;
      baba is self::You* || (throw "Fail!");
    }
    on core::TypeError* catch(no-exception-var) {
      baba is self::Me* || (throw "Fail!");
    }
  }
}

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