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::•()
    ;
}
class Base2 extends self::Base1 {
  synthetic constructor •() → self::Base2
    : super self::Base1::•()
    ;
}
abstract class _Base3&Object&Base2 extends core::Object implements self::Base2 /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_Base3&Object&Base2
    : super core::Object::•()
    ;
}
class Base3 extends self::_Base3&Object&Base2 {
  synthetic constructor •() → self::Base3
    : super self::_Base3&Object&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}
}
