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%>
    : super core::Object::•()
    ;
  method foo() → dynamic
    return 40;
  method f() → dynamic
    return 3;
}
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%>
    : super self::_C&Super&Mixin::•()
    ;
}
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
    : super self::_D&Super&Mixin::•()
    ;
}
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 {
  core::print(new self::C::•<dynamic>().{self::_C&Super&Mixin::foo}(){() → dynamic});
  core::print(new self::C2::•<dynamic>().{self::C2::foo}(){() → dynamic});
}

library test.mixin_library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
//   foo() => super.foo() + f();
//                  ^^^
//
import self as mix;
import "dart:core" as core;

class Mixin<T extends core::Object? = dynamic> extends core::Object {
  field dynamic x = mix::f();
  field dynamic y = null;
  field dynamic z = null;
  covariant-by-class field mix::Mixin::T? t = null;
  synthetic constructor •() → mix::Mixin<mix::Mixin::T%>
    : super core::Object::•()
    ;
  method foo() → dynamic
    return invalid-expression "pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
  foo() => super.foo() + f();
                 ^^^"{<invalid>}.+(mix::f());
  method g(covariant-by-class mix::Mixin::T% a) → mix::Mixin::T?
    return null;
  method h() → dynamic
    return mix::V();
  method l() → dynamic
    return mix::_private();
  method _privateMethod() → dynamic
    return 49;
  method publicMethod() → dynamic
    return this.{mix::Mixin::_privateMethod}(){() → dynamic};
}
static method f() → dynamic
  return 2;
static method V() → dynamic
  return 87;
static method _private() → dynamic
  return 117;
static method foo(dynamic m) → dynamic
  return m{dynamic}._privateMethod();
