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

class C1 extends core::Object {
  final field core::int id;
  constructor n1(initializing-formal core::int id, [core::String s = #C1]) → self::C1
    : self::C1::id = id, super core::Object::•() {
    self::log = 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#(initializing-formal 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 synthetic 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(initializing-formal 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 synthetic 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 = constructor-tearoff self::C1::n1
  #C4 = static-tearoff self::ET1|constructor#_#n1#tearOff
}
