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

class Foo extends core::Object {
  field core::List<dynamic>* list = <dynamic>[1, 2, 3];
  synthetic constructor •() → self::Foo*
    : super core::Object::•()
    ;
  set first(dynamic x) → void
    return let final core::List<dynamic>* #t1 = this.{self::Foo::list} in let final core::int* #t2 = 0 in let final dynamic #t3 = x in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3) in #t3;
  operator []=(dynamic x, dynamic y) → void
    return let final core::List<dynamic>* #t5 = this.{self::Foo::list} in let final core::int #t6 = x as{TypeError,ForDynamic} core::int in let final dynamic #t7 = y in let final void #t8 = #t5.{core::List::[]=}(#t6, #t7) in #t7;
  method clear() → void
    return this.{self::Foo::list}.{core::List::clear}();
  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*;
}
static method main() → dynamic {
  new self::Foo::•().{self::Foo::first} = 4;
  new self::Foo::•().{self::Foo::[]=}(3, 4);
  new self::Foo::•().{self::Foo::clear}();
}
