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

import "org-dartlang-testcase:///mixin_library.dart" show Mixin;

class Super<S extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::Super<self::Super::S%>
    ;
  method foo() → dynamic
    ;
  method f() → dynamic
    ;
}
abstract class _C&Super&Mixin<V extends core::Object? = dynamic> = self::Super<self::_C&Super&Mixin::V%> with mix::Mixin<self::_C&Super&Mixin::V%> /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V%>
    : super self::Super::•()
    ;
  mixin-super-stub get x() → dynamic
    return super.{mix::Mixin::x};
  mixin-super-stub set x(dynamic value) → void
    return super.{mix::Mixin::x} = value;
  mixin-super-stub get y() → dynamic
    return super.{mix::Mixin::y};
  mixin-super-stub set y(dynamic value) → void
    return super.{mix::Mixin::y} = value;
  mixin-super-stub get z() → dynamic
    return super.{mix::Mixin::z};
  mixin-super-stub set z(dynamic value) → void
    return super.{mix::Mixin::z} = value;
  mixin-super-stub get t() → self::_C&Super&Mixin::V?
    return super.{mix::Mixin::t};
  mixin-super-stub set t(covariant-by-class self::_C&Super&Mixin::V? value) → void
    return super.{mix::Mixin::t} = value;
  mixin-super-stub method foo() → dynamic
    return super.{mix::Mixin::foo}();
  mixin-super-stub method g(covariant-by-class self::_C&Super&Mixin::V% a) → self::_C&Super&Mixin::V?
    return super.{mix::Mixin::g}(a);
  mixin-super-stub method h() → dynamic
    return super.{mix::Mixin::h}();
  mixin-super-stub method l() → dynamic
    return super.{mix::Mixin::l}();
  mixin-super-stub method _privateMethod() → dynamic
    return super.{mix::Mixin::_privateMethod}();
  mixin-super-stub method publicMethod() → dynamic
    return super.{mix::Mixin::publicMethod}();
}
class C<V extends core::Object? = dynamic> extends self::_C&Super&Mixin<self::C::V%> {
  synthetic constructor •() → self::C<self::C::V%>
    ;
}
abstract class _D&Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_D&Super&Mixin
    : super self::Super::•()
    ;
  mixin-super-stub get x() → dynamic
    return super.{mix::Mixin::x};
  mixin-super-stub set x(dynamic value) → void
    return super.{mix::Mixin::x} = value;
  mixin-super-stub get y() → dynamic
    return super.{mix::Mixin::y};
  mixin-super-stub set y(dynamic value) → void
    return super.{mix::Mixin::y} = value;
  mixin-super-stub get z() → dynamic
    return super.{mix::Mixin::z};
  mixin-super-stub set z(dynamic value) → void
    return super.{mix::Mixin::z} = value;
  mixin-super-stub get t() → dynamic
    return super.{mix::Mixin::t};
  mixin-super-stub set t(covariant-by-class dynamic value) → void
    return super.{mix::Mixin::t} = value;
  mixin-super-stub method foo() → dynamic
    return super.{mix::Mixin::foo}();
  mixin-super-stub method g(covariant-by-class dynamic a) → dynamic
    return super.{mix::Mixin::g}(a);
  mixin-super-stub method h() → dynamic
    return super.{mix::Mixin::h}();
  mixin-super-stub method l() → dynamic
    return super.{mix::Mixin::l}();
  mixin-super-stub method _privateMethod() → dynamic
    return super.{mix::Mixin::_privateMethod}();
  mixin-super-stub method publicMethod() → dynamic
    return super.{mix::Mixin::publicMethod}();
}
class D extends self::_D&Super&Mixin {
  synthetic constructor •() → self::D
    ;
}
class C2<V extends core::Object? = dynamic> = self::Super<self::C2::V%> with mix::Mixin<self::C2::V%> {
  synthetic constructor •() → self::C2<self::C2::V%>
    : super self::Super::•()
    ;
  mixin-super-stub get x() → dynamic
    return super.{mix::Mixin::x};
  mixin-super-stub set x(dynamic value) → void
    return super.{mix::Mixin::x} = value;
  mixin-super-stub get y() → dynamic
    return super.{mix::Mixin::y};
  mixin-super-stub set y(dynamic value) → void
    return super.{mix::Mixin::y} = value;
  mixin-super-stub get z() → dynamic
    return super.{mix::Mixin::z};
  mixin-super-stub set z(dynamic value) → void
    return super.{mix::Mixin::z} = value;
  mixin-super-stub get t() → self::C2::V?
    return super.{mix::Mixin::t};
  mixin-super-stub set t(covariant-by-class self::C2::V? value) → void
    return super.{mix::Mixin::t} = value;
  mixin-super-stub method foo() → dynamic
    return super.{mix::Mixin::foo}();
  mixin-super-stub method g(covariant-by-class self::C2::V% a) → self::C2::V?
    return super.{mix::Mixin::g}(a);
  mixin-super-stub method h() → dynamic
    return super.{mix::Mixin::h}();
  mixin-super-stub method l() → dynamic
    return super.{mix::Mixin::l}();
  mixin-super-stub method _privateMethod() → dynamic
    return super.{mix::Mixin::_privateMethod}();
  mixin-super-stub method publicMethod() → dynamic
    return super.{mix::Mixin::publicMethod}();
}
class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
  synthetic constructor •() → self::D2
    : super self::Super::•()
    ;
  mixin-super-stub get x() → dynamic
    return super.{mix::Mixin::x};
  mixin-super-stub set x(dynamic value) → void
    return super.{mix::Mixin::x} = value;
  mixin-super-stub get y() → dynamic
    return super.{mix::Mixin::y};
  mixin-super-stub set y(dynamic value) → void
    return super.{mix::Mixin::y} = value;
  mixin-super-stub get z() → dynamic
    return super.{mix::Mixin::z};
  mixin-super-stub set z(dynamic value) → void
    return super.{mix::Mixin::z} = value;
  mixin-super-stub get t() → dynamic
    return super.{mix::Mixin::t};
  mixin-super-stub set t(covariant-by-class dynamic value) → void
    return super.{mix::Mixin::t} = value;
  mixin-super-stub method foo() → dynamic
    return super.{mix::Mixin::foo}();
  mixin-super-stub method g(covariant-by-class dynamic a) → dynamic
    return super.{mix::Mixin::g}(a);
  mixin-super-stub method h() → dynamic
    return super.{mix::Mixin::h}();
  mixin-super-stub method l() → dynamic
    return super.{mix::Mixin::l}();
  mixin-super-stub method _privateMethod() → dynamic
    return super.{mix::Mixin::_privateMethod}();
  mixin-super-stub method publicMethod() → dynamic
    return super.{mix::Mixin::publicMethod}();
}
static method main() → dynamic
  ;

library test.mixin_library /*isNonNullableByDefault*/;
import self as mix;
import "dart:core" as core;

class Mixin<T extends core::Object? = dynamic> extends core::Object {
  field dynamic x;
  field dynamic y;
  field dynamic z;
  covariant-by-class field mix::Mixin::T? t;
  synthetic constructor •() → mix::Mixin<mix::Mixin::T%>
    ;
  method foo() → dynamic
    ;
  method g(covariant-by-class mix::Mixin::T% a) → mix::Mixin::T?
    ;
  method h() → dynamic
    ;
  method l() → dynamic
    ;
  method _privateMethod() → dynamic
    ;
  method publicMethod() → dynamic
    ;
}
static method f() → dynamic
  ;
static method V() → dynamic
  ;
static method _private() → dynamic
  ;
static method foo(dynamic m) → dynamic
  ;
