library test.mixin_library;
//
// 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 self;
import "dart:core" as core;

class Mixin<T extends core::Object* = dynamic> extends core::Object {
  field dynamic x = self::f();
  field dynamic y = null;
  field dynamic z = null;
  generic-covariant-impl field self::Mixin::T* t = null;
  synthetic constructor •() → self::Mixin<self::Mixin::T*>*
    : super core::Object::•()
    ;
  method foo() → dynamic
    return super.foo().+(self::f());
  method g(generic-covariant-impl self::Mixin::T* a) → self::Mixin::T*
    return null;
  method h() → dynamic
    return self::V();
  method l() → dynamic
    return self::_private();
  method _privateMethod() → dynamic
    return 49;
  method publicMethod() → dynamic
    return this.{self::Mixin::_privateMethod}();
}
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._privateMethod();
