library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class Super extends core::Object {
  synthetic constructor •() → self::Super
    : super core::Object::•()
    ;
  method extendedConcreteMixedInAbstractMethod() → void {}
  method extendedConcreteMixedInConcreteMethod() → void {}
  method extendedConcreteMixedInAbstractImplementedMethod(core::int i) → void {}
  method extendedConcreteMixedInConcreteImplementedMethod(core::int i) → void {}
}
class Interface extends core::Object {
  synthetic constructor •() → self::Interface
    : super core::Object::•()
    ;
  method extendedConcreteMixedInAbstractImplementedMethod(covariant core::num i) → void {}
  method extendedConcreteMixedInConcreteImplementedMethod(covariant core::num i) → void {}
}
abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
  abstract method extendedConcreteMixedInAbstractMethod() → void;
  method extendedConcreteMixedInConcreteMethod() → void {}
  abstract method extendedConcreteMixedInAbstractImplementedMethod(core::int i) → void;
  method extendedConcreteMixedInConcreteImplementedMethod(core::int i) → void {}
}
class Class = self::Super with self::Mixin implements self::Interface {
  synthetic constructor •() → self::Class
    : super self::Super::•()
    ;
  mixin-super-stub method extendedConcreteMixedInConcreteMethod() → void
    return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
  abstract forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::num i) → void;
  forwarding-stub method extendedConcreteMixedInConcreteImplementedMethod(covariant core::num i) → void
    return super.{self::Mixin::extendedConcreteMixedInConcreteImplementedMethod}(i);
}
class Sub extends self::Class {
  synthetic constructor •() → self::Sub
    : super self::Class::•()
    ;
  method test() → void {
    this.{self::Mixin::extendedConcreteMixedInAbstractMethod}();
    super.{self::Super::extendedConcreteMixedInAbstractMethod}();
    this.{self::Class::extendedConcreteMixedInConcreteMethod}();
    super.{self::Class::extendedConcreteMixedInConcreteMethod}();
    this.{self::Sub::extendedConcreteMixedInAbstractImplementedMethod}(0);
    super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(0);
    this.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
    super.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
  }
  abstract forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant core::num i) → void;
}
static method main() → dynamic {}
