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

import "dart:convert";

abstract class IFoo extends core::Object {
  synthetic constructor •() → self::IFoo
    : super core::Object::•()
    ;
  @#C1
  abstract method toString() → core::String;
}
class Foo extends core::Object implements self::IFoo {
  synthetic constructor •() → self::Foo
    : super core::Object::•()
    ;
  @#C1
  method toString() → core::String
    return "I am a Foo";
}
class FooEnum extends core::Object implements core::Enum /*isEnum*/  {
  final field core::int index;
  final field core::String _name;
  static const field core::List<self::FooEnum> values = #C11;
  static const field self::FooEnum A = #C4;
  static const field self::FooEnum B = #C7;
  static const field self::FooEnum C = #C10;
  const constructor •(core::int index, core::String _name) → self::FooEnum
    : self::FooEnum::index = index, self::FooEnum::_name = _name, super core::Object::•()
    ;
  method toString() → core::String
    return this.{self::FooEnum::_name}{core::String};
}
class Keep extends core::Object {
  synthetic constructor •() → self::Keep
    : super core::Object::•()
    ;
  @#C14
  @#C1
  method toString() → core::String
    return "I am a Keep";
}
static const field core::pragma keepToString = #C14;
static method toString() → core::String
  return "I am static";
static method main() → void {
  final self::IFoo foo = new self::Foo::•();
  core::print(foo.{self::IFoo::toString}(){() → core::String});
  core::print(new self::Keep::•().{self::Keep::toString}(){() → core::String});
  core::print((#C7).{self::FooEnum::toString}(){() → core::String});
}
constants  {
  #C1 = core::_Override {}
  #C2 = 0
  #C3 = "FooEnum.A"
  #C4 = self::FooEnum {index:#C2, _name:#C3}
  #C5 = 1
  #C6 = "FooEnum.B"
  #C7 = self::FooEnum {index:#C5, _name:#C6}
  #C8 = 2
  #C9 = "FooEnum.C"
  #C10 = self::FooEnum {index:#C8, _name:#C9}
  #C11 = <self::FooEnum*>[#C4, #C7, #C10]
  #C12 = "flutter:keep-to-string"
  #C13 = null
  #C14 = core::pragma {name:#C12, options:#C13}
}
