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 super.toString();
}
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}
}
