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::_Enum /*isEnum*/  {
  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
    : super core::_Enum::•(index, name)
    ;
  method toString() → core::String
    return "FooEnum.${this.{core::_Enum::_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 = "A"
  #C4 = self::FooEnum {index:#C2, _name:#C3}
  #C5 = 1
  #C6 = "B"
  #C7 = self::FooEnum {index:#C5, _name:#C6}
  #C8 = 2
  #C9 = "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}
}
