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

class C1 extends core::Object {
  final field core::int id;
  constructor n1(core::int id, [core::String s = #C1]) → self::C1
    : self::C1::id = id, super core::Object::•() {
    self::log = s;
  }
  static method _#n1#tearOff(core::int id, [core::String s = #C1]) → self::C1
    return new self::C1::n1(id, s);
}
extension type ET1(core::int id) {
  abstract extension-type-member representation-field get id() → core::int;
  constructor • = self::ET1|constructor#;
  constructor tearoff • = self::ET1|constructor#_#new#tearOff;
  constructor n1 = self::ET1|constructor#n1;
  constructor tearoff n1 = self::ET1|constructor#_#n1#tearOff;
}
static field dynamic log;
static extension-type-member method ET1|constructor#(core::int id) → self::ET1% /* erasure=core::int, declared=! */ {
  lowered final self::ET1% /* erasure=core::int, declared=! */ #this = id;
  return #this;
}
static extension-type-member method ET1|constructor#_#new#tearOff(core::int id) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#(id);
static extension-type-member method ET1|constructor#n1(core::int id, [core::String s = #C2]) → self::ET1% /* erasure=core::int, declared=! */ {
  lowered final self::ET1% /* erasure=core::int, declared=! */ #this = id;
  {
    self::log = s;
  }
  return #this;
}
static extension-type-member method ET1|constructor#_#n1#tearOff(core::int id, [core::String s = #C2]) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#n1(id, s);
static method main() → dynamic {
  (core::int, [core::String]) → self::C1 x = #C3;
  x(0){(core::int, [core::String]) → self::C1};
  self::expect("a", self::log);
  (core::int, [core::String]) → self::ET1% /* erasure=core::int, declared=! */ y = #C4;
  y(1){(core::int, [core::String]) → self::ET1% /* erasure=core::int, declared=! */};
  self::expect("b", self::log);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = "a"
  #C2 = "b"
  #C3 = static-tearoff self::C1::_#n1#tearOff
  #C4 = static-tearoff self::ET1|constructor#_#n1#tearOff
}
