library;
import self as self;
import "dart:core" as core;

abstract class B extends core::Object /*hasConstConstructor*/  {
  final field core::bool autofocus;
  const constructor •({required core::bool autofocus}) → self::B
    : self::B::autofocus = autofocus, super core::Object::•()
    ;
}
class O1 extends self::B /*hasConstConstructor*/  {
  const constructor •({core::bool autofocus = #C1}) → self::O1
    : super self::B::•(autofocus: autofocus)
    ;
  static method _#new#tearOff({core::bool autofocus = #C1}) → self::O1
    return new self::O1::•(autofocus: autofocus);
}
class O2 extends self::B /*hasConstConstructor*/  {
  const constructor •({core::bool autofocus = #C1}) → self::O2
    : super self::B::•(autofocus: autofocus)
    ;
  static method _#new#tearOff({core::bool autofocus = #C1}) → self::O2
    return new self::O2::•(autofocus: autofocus);
}
abstract class C extends core::Object /*hasConstConstructor*/  {
  final field core::bool a;
  final field core::bool b;
  const constructor •({core::bool a = #C1, core::bool b = #C2}) → self::C
    : self::C::a = a, self::C::b = b, super core::Object::•()
    ;
}
class P1 extends self::C /*hasConstConstructor*/  {
  final field core::int c;
  const constructor •(core::int c, {core::bool a = #C1, core::bool b = #C2}) → self::P1
    : self::P1::c = c, super self::C::•(a: a, b: b)
    ;
  static method _#new#tearOff(core::int c, {core::bool a = #C1, core::bool b = #C2}) → self::P1
    return new self::P1::•(c, a: a, b: b);
}
class P2 extends self::C /*hasConstConstructor*/  {
  const constructor •({core::bool b = #C2, core::bool a = #C1}) → self::P2
    : super self::C::•(b: b, a: a)
    ;
  static method _#new#tearOff({core::bool b = #C2, core::bool a = #C1}) → self::P2
    return new self::P2::•(b: b, a: a);
}
static method main() → dynamic {
  ({autofocus: core::bool}) → self::O1 tearoff1 = #C3;
  ({autofocus: core::bool}) → self::O2 tearoff2 = #C4;
  (core::int, {a: core::bool, b: core::bool}) → self::P1 tearoff3 = #C5;
  ({a: core::bool, b: core::bool}) → self::P2 tearoff4 = #C6;
  self::expect(true, tearoff1(){({autofocus: core::bool}) → self::O1}.{self::B::autofocus}{core::bool});
  self::expect(true, tearoff2(){({autofocus: core::bool}) → self::O2}.{self::B::autofocus}{core::bool});
  self::expect(true, tearoff3(0){(core::int, {a: core::bool, b: core::bool}) → self::P1}.{self::C::a}{core::bool});
  self::expect(false, tearoff3(0){(core::int, {a: core::bool, b: core::bool}) → self::P1}.{self::C::b}{core::bool});
  self::expect(0, tearoff3(0){(core::int, {a: core::bool, b: core::bool}) → self::P1}.{self::P1::c}{core::int});
  self::expect(true, tearoff4(){({a: core::bool, b: core::bool}) → self::P2}.{self::C::a}{core::bool});
  self::expect(false, tearoff4(){({a: core::bool, b: core::bool}) → self::P2}.{self::C::b}{core::bool});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = true
  #C2 = false
  #C3 = static-tearoff self::O1::_#new#tearOff
  #C4 = static-tearoff self::O2::_#new#tearOff
  #C5 = static-tearoff self::P1::_#new#tearOff
  #C6 = static-tearoff self::P2::_#new#tearOff
}
