library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/abstract_super_application.dart:26:7: Error: 'Object' doesn't implement 'Super' so it can't be used with 'Mixin'.
//  - 'Object' is from 'dart:core'.
//  - 'Super' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
//  - 'Mixin' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
// class Class2 with Mixin implements Super {}
//       ^
//
// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-invoked member 'method'.
// class Class2 with Mixin implements Super {}
//                   ^
// pkg/front_end/testcases/general/abstract_super_application.dart:12:11: Context: This is the super-access that doesn't have a concrete target.
//     super.method();
//           ^
//
// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed member 'property'.
// class Class2 with Mixin implements Super {}
//                   ^
// pkg/front_end/testcases/general/abstract_super_application.dart:16:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.property;
//                  ^
//
// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property'.
// class Class2 with Mixin implements Super {}
//                   ^
// pkg/front_end/testcases/general/abstract_super_application.dart:20:11: Context: This is the super-access that doesn't have a concrete target.
//     super.property = value;
//           ^
//
import self as self;
import "dart:core" as core;

class Super extends core::Object {
  field core::int property = 42;
  synthetic constructor •() → self::Super
    : super core::Object::•()
    ;
  method method() → void {}
}
abstract class Mixin extends self::Super /*isMixinDeclaration*/  {
  method method() → void {
    super.{self::Super::method}();
  }
  get property() → core::int {
    return super.{self::Super::property};
  }
  set property(core::int value) → void {
    super.{self::Super::property} = value;
  }
}
abstract class _Class1&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Class1&Super&Mixin
    : super self::Super::•()
    ;
  mixin-super-stub get property() → core::int
    return super.{self::Mixin::property};
  mixin-super-stub set property(core::int value) → void
    return super.{self::Mixin::property} = value;
  mixin-super-stub method method() → void
    return super.{self::Mixin::method}();
}
class Class1 extends self::_Class1&Super&Mixin {
  synthetic constructor •() → self::Class1
    : super self::_Class1&Super&Mixin::•()
    ;
}
abstract class _Class2&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_Class2&Object&Mixin
    : super core::Object::•()
    ;
  mixin-super-stub get property() → core::int
    return super.{self::Mixin::property};
  mixin-super-stub set property(core::int value) → void
    return super.{self::Mixin::property} = value;
  mixin-super-stub method method() → void
    return super.{self::Mixin::method}();
}
class Class2 extends self::_Class2&Object&Mixin implements self::Super {
  synthetic constructor •() → self::Class2
    : super self::_Class2&Object&Mixin::•()
    ;
}
