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

extension type Class(core::int it) {
  abstract extension-type-member representation-field get it() → core::int;
  constructor • = self::Class|constructor#;
  constructor tearoff • = self::Class|constructor#_#new#tearOff;
  constructor named = self::Class|constructor#named;
  constructor tearoff named = self::Class|constructor#_#named#tearOff;
}
extension type GenericClass<T extends core::Object? = dynamic>(T% it) {
  abstract extension-type-member representation-field get it() → T%;
  constructor • = self::GenericClass|constructor#;
  constructor tearoff • = self::GenericClass|constructor#_#new#tearOff;
}
static extension-type-member method Class|constructor#(core::int it) → self::Class% /* erasure=core::int, declared=! */ {
  lowered final self::Class% /* erasure=core::int, declared=! */ #this = it;
  return #this;
}
static extension-type-member method Class|constructor#_#new#tearOff(core::int it) → self::Class% /* erasure=core::int, declared=! */
  return self::Class|constructor#(it);
static extension-type-member method Class|constructor#named(core::int it) → self::Class% /* erasure=core::int, declared=! */ {
  lowered final self::Class% /* erasure=core::int, declared=! */ #this = it.{core::num::+}(1){(core::num) → core::int};
  return #this;
}
static extension-type-member method Class|constructor#_#named#tearOff(core::int it) → self::Class% /* erasure=core::int, declared=! */
  return self::Class|constructor#named(it);
static extension-type-member method GenericClass|constructor#<T extends core::Object? = dynamic>(self::GenericClass|constructor#::T% it) → self::GenericClass<self::GenericClass|constructor#::T%>% /* erasure=self::GenericClass|constructor#::T%, declared=! */ {
  lowered final self::GenericClass<self::GenericClass|constructor#::T%>% /* erasure=self::GenericClass|constructor#::T%, declared=! */ #this = it;
  return #this;
}
static extension-type-member method GenericClass|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::GenericClass|constructor#_#new#tearOff::T% it) → self::GenericClass<self::GenericClass|constructor#_#new#tearOff::T%>% /* erasure=self::GenericClass|constructor#_#new#tearOff::T%, declared=! */
  return self::GenericClass|constructor#<self::GenericClass|constructor#_#new#tearOff::T%>(it);
static method main() → dynamic {
  self::Class% /* erasure=core::int, declared=! */ a = self::Class|constructor#(3);
  self::Class% /* erasure=core::int, declared=! */ b = self::Class|constructor#(4);
  self::Class% /* erasure=core::int, declared=! */ b2 = #C1(4){(core::int) → self::Class% /* erasure=core::int, declared=! */};
  self::Class% /* erasure=core::int, declared=! */ c = self::Class|constructor#named(5);
  self::Class% /* erasure=core::int, declared=! */ c2 = #C2(5){(core::int) → self::Class% /* erasure=core::int, declared=! */};
  self::GenericClass<core::String>% /* erasure=core::String, declared=! */ d = self::GenericClass|constructor#<core::String>("foo");
  self::GenericClass<core::String>% /* erasure=core::String, declared=! */ d2 = #C4("foo"){(core::String) → self::GenericClass<core::String>% /* erasure=core::String, declared=! */};
  self::GenericClass<core::String>% /* erasure=core::String, declared=! */ d3 = #C3<core::String>("foo"){(core::String) → self::GenericClass<core::String>% /* erasure=core::String, declared=! */};
  self::GenericClass<core::String>% /* erasure=core::String, declared=! */ e = self::GenericClass|constructor#<core::String>("bar");
  self::GenericClass<core::String>% /* erasure=core::String, declared=! */ e2 = #C4("bar"){(core::String) → self::GenericClass<core::String>% /* erasure=core::String, declared=! */};
  self::GenericClass<core::String>% /* erasure=core::String, declared=! */ e3 = #C3<core::String>("bar"){(core::String) → self::GenericClass<core::String>% /* erasure=core::String, declared=! */};
  self::GenericClass<core::int>% /* erasure=core::int, declared=! */ f = self::GenericClass|constructor#<core::int>(42);
  self::GenericClass<core::int>% /* erasure=core::int, declared=! */ f2 = #C5(42){(core::int) → self::GenericClass<core::int>% /* erasure=core::int, declared=! */};
  self::GenericClass<core::int>% /* erasure=core::int, declared=! */ f3 = #C3<core::int>(42){(core::int) → self::GenericClass<core::int>% /* erasure=core::int, declared=! */};
  self::GenericClass<core::int>% /* erasure=core::int, declared=! */ g = self::GenericClass|constructor#<core::int>(87);
  self::GenericClass<core::int>% /* erasure=core::int, declared=! */ g2 = #C3<core::int>(87){(core::int) → self::GenericClass<core::int>% /* erasure=core::int, declared=! */};
  self::GenericClass<core::num>% /* erasure=core::num, declared=! */ h = self::GenericClass|constructor#<core::num>(123);
  self::GenericClass<core::num>% /* erasure=core::num, declared=! */ h2 = #C3<core::num>(123){(core::num) → self::GenericClass<core::num>% /* erasure=core::num, declared=! */};
  self::expect(3, a as{Unchecked} core::int);
  self::expect(3, a);
  self::expect(4, b as{Unchecked} core::int);
  self::expect(4, b);
  self::expect(4, b2 as{Unchecked} core::int);
  self::expect(4, b2);
  self::expect(6, c as{Unchecked} core::int);
  self::expect(6, c);
  self::expect(6, c2 as{Unchecked} core::int);
  self::expect(6, c2);
  self::expect("foo", d as{Unchecked} core::String);
  self::expect("foo", d);
  self::expect("foo", d2 as{Unchecked} core::String);
  self::expect("foo", d2);
  self::expect("foo", d3 as{Unchecked} core::String);
  self::expect("foo", d3);
  self::expect("bar", e as{Unchecked} core::String);
  self::expect("bar", e);
  self::expect("bar", e2 as{Unchecked} core::String);
  self::expect("bar", e2);
  self::expect("bar", e3 as{Unchecked} core::String);
  self::expect("bar", e3);
  self::expect(42, f as{Unchecked} core::int);
  self::expect(42, f);
  self::expect(42, f2 as{Unchecked} core::int);
  self::expect(42, f2);
  self::expect(42, f3 as{Unchecked} core::int);
  self::expect(42, f3);
  self::expect(87, g as{Unchecked} core::int);
  self::expect(87, g);
  self::expect(87, g2 as{Unchecked} core::int);
  self::expect(87, g2);
  self::expect(123, h as{Unchecked} core::num);
  self::expect(123, h);
  self::expect(123, h2 as{Unchecked} core::num);
  self::expect(123, h2);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = static-tearoff self::Class|constructor#_#new#tearOff
  #C2 = static-tearoff self::Class|constructor#_#named#tearOff
  #C3 = static-tearoff self::GenericClass|constructor#_#new#tearOff
  #C4 = instantiation #C3 <core::String>
  #C5 = instantiation #C3 <core::int>
}
