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 {}
//       ^
//
import self as self;
import "dart:core" as core;

class Super extends core::Object {
  field core::int property;
  synthetic constructor •() → self::Super
    ;
  method method() → void
    ;
}
abstract class Mixin extends self::Super /*isMixinDeclaration*/  {
  method method() → void
    ;
  get property() → core::int
    ;
  set property(core::int value) → void
    ;
}
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
    ;
}
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
    ;
}
