library /*isNonNullableByDefault*/;
import self as self;

import "org-dartlang-testcase:///b_lib.dart";

static method main() → dynamic
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;

library /*isNonNullableByDefault*/;
import self as self2;
import "a_lib.dart" as a_l;
import "m_lib.dart" as m_l;
import "dart:core" as core;

import "org-dartlang-testcase:///a_lib.dart";
import "org-dartlang-testcase:///m_lib.dart";

abstract class _B&A&M = a_l::A with m_l::M /*isAnonymousMixin*/  {
  synthetic constructor •({core::double d, (core::String) → core::String s}) → self2::_B&A&M
    : super a_l::A::•(d: d, s: s)
    ;
  synthetic constructor factoryConstructor({core::double d, (core::String) → core::String s}) → self2::_B&A&M
    : super a_l::A::factoryConstructor(d: d, s: s)
    ;
  mixin-super-stub method m1() → dynamic
    return super.{m_l::M::m1}();
}
class B extends self2::_B&A&M {
  constructor •({core::double d}) → self2::B
    ;
  static method _#new#tearOff({core::double d}) → self2::B
    return new self2::B::•(d: d);
}

library /*isNonNullableByDefault*/;
import self as m_l;
import "a_lib.dart" as a_l;

import "org-dartlang-testcase:///a_lib.dart";

abstract class M extends a_l::A /*isMixinDeclaration*/  {
  method m1() → dynamic
    ;
}

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

import "org-dartlang-testcase:///t_lib.dart";

class A extends core::Object {
  final field core::double d;
  final field (core::String) → core::String _s;
  constructor •({core::double d, (core::String) → core::String s}) → a_l::A
    ;
  constructor factoryConstructor({core::double d, (core::String) → core::String s}) → a_l::A
    ;
  static method _#new#tearOff({core::double d, (core::String) → core::String s}) → a_l::A
    return new a_l::A::•(d: d, s: s);
  static method _#factoryConstructor#tearOff({core::double d, (core::String) → core::String s}) → a_l::A
    return new a_l::A::factoryConstructor(d: d, s: s);
  method doStringy(core::String i) → core::String
    ;
}
static method _defaultStringy(core::String t) → core::String
  ;

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

typedef StringyFunction<contravariant T extends core::Object? = dynamic> = (T%) → core::String;
