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";
}
@#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}
}
