library #lib /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get foo() → core::String
    return "foo";
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3]  method getBar() → core::String
    return "bar";
}
class B extends core::_Enum /*isEnum*/  {
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5]  method toString() → core::String
    return "B.${[@vm.direct-call.metadata=dart.core::_Enum._name] this.{core::_Enum::_name}{core::String}}";
}
static method test0() → void {
  core::print(#C1);
}
static method test1() → void {
  core::print(#C2);
}
static method test2() → void {
  core::print(#C3);
}
[@vm.unboxing-info.metadata=()->d]static get getD() → dynamic
  return 100.0;
static method testDouble() → void {
  core::print(#C4);
  core::print([@vm.inferred-type.metadata=dart.core::_Double (value: 100.0)] self::getD);
}
static method testStrings([@vm.inferred-type.metadata=#lib::A] self::A a0) → void {
  core::print([@vm.direct-call.metadata=#lib::A.foo] [@vm.inferred-type.metadata=dart.core::_OneByteString (value: "foo")] a0.{self::A::foo}{core::String});
  core::print([@vm.direct-call.metadata=#lib::A.getBar] [@vm.inferred-type.metadata=dart.core::_OneByteString (skip check) (value: "bar")] a0.{self::A::getBar}(){() → core::String});
  core::print(#C5);
}
static method testPassEnum() → void {
  self::testPassEnum2();
}
static method testPassEnum2() → void {
  core::print(#C8);
}
static method getList() → dynamic
  return #C11;
static method testList() → void {
  core::print(#C11);
  core::print(#C14);
}
static method main() → dynamic {
  self::test0();
  self::test1();
  self::test2();
  self::testDouble();
  self::testStrings(new self::A::•());
  self::testPassEnum();
  let final dynamic #t1 = [@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const <dart.core::int*>[1, 2, 3])] self::getList() in self::testList();
}
constants  {
  #C1 = 40
  #C2 = 42
  #C3 = 43
  #C4 = 3.14
  #C5 = "bazz"
  #C6 = 1
  #C7 = "b2"
  #C8 = self::B {index:#C6, _name:#C7}
  #C9 = 2
  #C10 = 3
  #C11 = <core::int*>[#C6, #C9, #C10]
  #C12 = 4
  #C13 = 5
  #C14 = <core::int*>[#C12, #C13]
}
