library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/hierarchy/static.dart:58:15: Error: Can't declare a member that conflicts with an inherited one.
//   static void extendedInstanceDeclaredStaticMethod() {}
//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/hierarchy/static.dart:7:8: Context: This is the inherited member.
//   void extendedInstanceDeclaredStaticMethod() {}
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/hierarchy/static.dart:67:18: Error: Can't declare a member that conflicts with an inherited one.
//   static int get extendedInstanceSetterDeclaredStaticGetter => 0;
//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/hierarchy/static.dart:16:12: Context: This is the inherited member.
//   void set extendedInstanceSetterDeclaredStaticGetter(int value) {}
//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/hierarchy/static.dart:70:15: Error: Can't declare a member that conflicts with an inherited one.
//   static void mixedInInstanceDeclaredStaticMethod() {}
//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/hierarchy/static.dart:27:8: Context: This is the inherited member.
//   void mixedInInstanceDeclaredStaticMethod() {}
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/hierarchy/static.dart:73:15: Error: Can't declare a member that conflicts with an inherited one.
//   static void implementedInstanceDeclaredStaticMethod() {}
//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/hierarchy/static.dart:38:8: Context: This is the inherited member.
//   void implementedInstanceDeclaredStaticMethod() {}
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/hierarchy/static.dart:82:18: Error: Can't declare a member that conflicts with an inherited one.
//   static int get implementedInstanceSetterDeclaredStaticGetter => 0;
//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/hierarchy/static.dart:47:12: Context: This is the inherited member.
//   void set implementedInstanceSetterDeclaredStaticGetter(int value) {}
//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/hierarchy/static.dart:61:19: Error: Can't declare a member that conflicts with an inherited one.
//   static void set extendedInstanceDeclaredStaticSetter(int value) {}
//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/hierarchy/static.dart:10:12: Context: This is the inherited member.
//   void set extendedInstanceDeclaredStaticSetter(int value) {}
//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/hierarchy/static.dart:64:19: Error: Can't declare a member that conflicts with an inherited one.
//   static void set extendedInstanceGetterDeclaredStaticSetter(int value) {}
//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/hierarchy/static.dart:13:11: Context: This is the inherited member.
//   int get extendedInstanceGetterDeclaredStaticSetter => 0;
//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/hierarchy/static.dart:76:19: Error: Can't declare a member that conflicts with an inherited one.
//   static void set implementedInstanceDeclaredStaticSetter(int value) {}
//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/hierarchy/static.dart:41:12: Context: This is the inherited member.
//   void set implementedInstanceDeclaredStaticSetter(int value) {}
//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/hierarchy/static.dart:79:19: Error: Can't declare a member that conflicts with an inherited one.
//   static void set implementedInstanceGetterDeclaredStaticSetter(int value) {}
//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/hierarchy/static.dart:44:11: Context: This is the inherited member.
//   int get implementedInstanceGetterDeclaredStaticSetter => 0;
//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;

class Super extends core::Object {
  synthetic constructor •() → self::Super
    ;
  static method extendedStaticDeclaredInstanceMethod() → void
    ;
  method extendedInstanceDeclaredStaticMethod() → void
    ;
  static set extendedStaticDeclaredInstanceSetter(core::int value) → void
    ;
  set extendedInstanceDeclaredStaticSetter(core::int value) → void
    ;
  static get extendedStaticGetterDeclaredInstanceSetter() → core::int
    ;
  get extendedInstanceGetterDeclaredStaticSetter() → core::int
    ;
  static set extendedStaticSetterDeclaredInstanceGetter(core::int value) → void
    ;
  set extendedInstanceSetterDeclaredStaticGetter(core::int value) → void
    ;
  static method extendedStaticMixedInInstanceMethod() → void
    ;
  method extendedInstanceMixedInStaticMethod() → void
    ;
  static method extendedStaticImplementedInstanceMethod() → void
    ;
  method extendedInstanceImplementedStaticMethod() → void
    ;
}
abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
  static method mixedInStaticDeclaredInstanceMethod() → void
    ;
  method mixedInInstanceDeclaredStaticMethod() → void
    ;
  static method mixedInStaticImplementedInstanceMethod() → void
    ;
  method mixedInInstanceImplementedStaticMethod() → void
    ;
  method extendedStaticMixedInInstanceMethod() → void
    ;
  static method extendedInstanceMixedInStaticMethod() → void
    ;
}
class Interface extends core::Object {
  synthetic constructor •() → self::Interface
    ;
  static method implementedStaticDeclaredInstanceMethod() → void
    ;
  method implementedInstanceDeclaredStaticMethod() → void
    ;
  static set implementedStaticDeclaredInstanceSetter(core::int value) → void
    ;
  set implementedInstanceDeclaredStaticSetter(core::int value) → void
    ;
  static get implementedStaticGetterDeclaredInstanceSetter() → core::int
    ;
  get implementedInstanceGetterDeclaredStaticSetter() → core::int
    ;
  static set implementedStaticSetterDeclaredInstanceGetter(core::int value) → void
    ;
  set implementedInstanceSetterDeclaredStaticGetter(core::int value) → void
    ;
  method extendedStaticImplementedInstanceMethod() → void
    ;
  static method extendedInstanceImplementedStaticMethod() → void
    ;
  method mixedInStaticImplementedInstanceMethod() → void
    ;
  static method mixedInInstanceImplementedStaticMethod() → void
    ;
}
abstract class Class extends self::_Class&Super&Mixin implements self::Interface {
  synthetic constructor •() → self::Class
    ;
  method extendedStaticDeclaredInstanceMethod() → void
    ;
  static method extendedInstanceDeclaredStaticMethod() → void
    ;
  set extendedStaticDeclaredInstanceSetter(core::int value) → void
    ;
  static set extendedInstanceDeclaredStaticSetter(core::int value) → void
    ;
  set extendedStaticGetterDeclaredInstanceSetter(core::int value) → void
    ;
  static set extendedInstanceGetterDeclaredStaticSetter(core::int value) → void
    ;
  get extendedStaticSetterDeclaredInstanceGetter() → core::int
    ;
  static get extendedInstanceSetterDeclaredStaticGetter() → core::int
    ;
  method mixedInStaticDeclaredInstanceMethod() → void
    ;
  static method mixedInInstanceDeclaredStaticMethod() → void
    ;
  method implementedStaticDeclaredInstanceMethod() → void
    ;
  static method implementedInstanceDeclaredStaticMethod() → void
    ;
  set implementedStaticDeclaredInstanceSetter(core::int value) → void
    ;
  static set implementedInstanceDeclaredStaticSetter(core::int value) → void
    ;
  set implementedStaticGetterDeclaredInstanceSetter(core::int value) → void
    ;
  static set implementedInstanceGetterDeclaredStaticSetter(core::int value) → void
    ;
  get implementedStaticSetterDeclaredInstanceGetter() → core::int
    ;
  static get implementedInstanceSetterDeclaredStaticGetter() → core::int
    ;
}
abstract class _Class&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class&Super&Mixin
    : super self::Super::•()
    ;
  synthetic mixin-super-stub method mixedInInstanceDeclaredStaticMethod() → void
    return super.{self::Mixin::mixedInInstanceDeclaredStaticMethod}();
  synthetic mixin-super-stub method mixedInInstanceImplementedStaticMethod() → void
    return super.{self::Mixin::mixedInInstanceImplementedStaticMethod}();
  synthetic mixin-super-stub method extendedStaticMixedInInstanceMethod() → void
    return super.{self::Mixin::extendedStaticMixedInInstanceMethod}();
}
static method main() → dynamic
  ;
