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

class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
}
class B extends self::A {
  synthetic constructor •() → self::B
    : super self::A::•()
    ;
}
extension type E1(self::A a) implements self::A {
  abstract extension-type-member representation-field get a() → self::A;
  constructor • = self::E1|constructor#;
  constructor tearoff • = self::E1|constructor#_#new#tearOff;
}
extension type E2(self::B b) implements self::B, self::E1 /* erasure=self::A */ {
  abstract extension-type-member representation-field get b() → self::B;
  constructor • = self::E2|constructor#;
  constructor tearoff • = self::E2|constructor#_#new#tearOff;
}
static extension-type-member method E1|constructor#(initializing-formal self::A a) → self::E1 /* erasure=self::A */ {
  lowered final self::E1 /* erasure=self::A */ #this = a;
  return #this;
}
static extension-type-member synthetic method E1|constructor#_#new#tearOff(self::A a) → self::E1 /* erasure=self::A */
  return self::E1|constructor#(a);
static extension-type-member method E2|constructor#(initializing-formal self::B b) → self::E2 /* erasure=self::B */ {
  lowered final self::E2 /* erasure=self::B */ #this = b;
  return #this;
}
static extension-type-member synthetic method E2|constructor#_#new#tearOff(self::B b) → self::E2 /* erasure=self::B */
  return self::E2|constructor#(b);
static method test(self::E2 /* erasure=self::B */ e) → dynamic {
  core::List<core::Object> list1 = <core::Object>["", e];
  core::List<core::Object> list2 = <core::Object>["", e];
}
