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;
  }
}
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 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(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
}
