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";
}
@#C16
class Base1 extends core::Object {
  synthetic constructor •() → self::Base1
    : super core::Object::•()
    ;
}
abstract class Base2 extends self::Base1 /*isMixinDeclaration*/  {
}
abstract class _Base3&Object&Base1 extends core::Object implements self::Base1 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_Base3&Object&Base1
    : super core::Object::•()
    ;
}
abstract class _Base3&Object&Base1&Base2 extends self::_Base3&Object&Base1 implements self::Base2 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_Base3&Object&Base1&Base2
    : super self::_Base3&Object&Base1::•()
    ;
}
class Base3 extends self::_Base3&Object&Base1&Base2 {
  synthetic constructor •() → self::Base3
    : super self::_Base3&Object&Base1&Base2::•()
    ;
}
class KeepInherited extends core::Object implements self::Base3 {
  synthetic constructor •() → self::KeepInherited
    : super core::Object::•()
    ;
  @#C1
  method toString() → core::String
    return "Heir";
}
class MyException extends core::Object implements core::Exception {
  synthetic constructor •() → self::MyException
    : super core::Object::•()
    ;
  @#C1
  method toString() → core::String
    return "A very detailed message";
}
static const field core::pragma keepToString = #C14;
static const field core::pragma keepToStringInSubtypes = #C16;
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});
  core::print(new self::KeepInherited::•().{self::KeepInherited::toString}(){() → core::String});
  core::print(new self::MyException::•().{self::MyException::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}
  #C15 = "flutter:keep-to-string-in-subtypes"
  #C16 = core::pragma {name:#C15, options:#C13}
}
