library;
import self as self;
import "dart:core" as core;
import "inherited_representation_field_lib.dart" as inh;

import "org-dartlang-testcase:///inherited_representation_field_lib.dart";

extension type A(core::int a) {
  abstract extension-type-member representation-field get a() → core::int;
  constructor • = self::A|constructor#;
  constructor tearoff • = self::A|constructor#_#new#tearOff;
}
extension type B(core::int b) implements self::A% /* erasure=core::int, declared=! */ {
  abstract extension-type-member representation-field get b() → core::int;
  method methodA = self::B|methodA;
  method tearoff methodA = self::B|get#methodA;
  method methodB = self::B|methodB;
  method tearoff methodB = self::B|get#methodB;
  constructor • = self::B|constructor#;
  constructor tearoff • = self::B|constructor#_#new#tearOff;
}
extension type C(core::int _c) {
  abstract extension-type-member representation-field get _c() → core::int;
  constructor • = self::C|constructor#;
  constructor tearoff • = self::C|constructor#_#new#tearOff;
}
extension type E(core::int _e) implements inh::D% /* erasure=core::int, declared=! */ {
  abstract extension-type-member representation-field get _e() → core::int;
  method methodC = self::E|methodC;
  method tearoff methodC = self::E|get#methodC;
  constructor • = self::E|constructor#;
  constructor tearoff • = self::E|constructor#_#new#tearOff;
}
extension type G<T extends core::Object? = dynamic>(T% g) {
  abstract extension-type-member representation-field get g() → T%;
  constructor • = self::G|constructor#;
  constructor tearoff • = self::G|constructor#_#new#tearOff;
}
extension type H<T extends core::Object? = dynamic>(core::List<T%> h) implements self::G<core::List<T%>>% /* erasure=core::List<T%>, declared=! */ {
  abstract extension-type-member representation-field get h() → core::List<T%>;
  constructor • = self::H|constructor#;
  constructor tearoff • = self::H|constructor#_#new#tearOff;
}
static extension-type-member method A|constructor#(core::int a) → self::A% /* erasure=core::int, declared=! */ {
  lowered final self::A% /* erasure=core::int, declared=! */ #this = a;
  return #this;
}
static extension-type-member method A|constructor#_#new#tearOff(core::int a) → self::A% /* erasure=core::int, declared=! */
  return self::A|constructor#(a);
static extension-type-member method B|constructor#(core::int b) → self::B% /* erasure=core::int, declared=! */ {
  lowered final self::B% /* erasure=core::int, declared=! */ #this = b;
  return #this;
}
static extension-type-member method B|constructor#_#new#tearOff(core::int b) → self::B% /* erasure=core::int, declared=! */
  return self::B|constructor#(b);
static extension-type-member method B|methodA(lowered final self::B% /* erasure=core::int, declared=! */ #this) → dynamic
  return #this as{Unchecked} core::int;
static extension-type-member method B|get#methodA(lowered final self::B% /* erasure=core::int, declared=! */ #this) → () → dynamic
  return () → dynamic => self::B|methodA(#this);
static extension-type-member method B|methodB(lowered final self::B% /* erasure=core::int, declared=! */ #this) → dynamic
  return #this as{Unchecked} core::int;
static extension-type-member method B|get#methodB(lowered final self::B% /* erasure=core::int, declared=! */ #this) → () → dynamic
  return () → dynamic => self::B|methodB(#this);
static extension-type-member method C|constructor#(core::int _c) → self::C% /* erasure=core::int, declared=! */ {
  lowered final self::C% /* erasure=core::int, declared=! */ #this = _c;
  return #this;
}
static extension-type-member method C|constructor#_#new#tearOff(core::int _c) → self::C% /* erasure=core::int, declared=! */
  return self::C|constructor#(_c);
static extension-type-member method E|constructor#(core::int _e) → self::E% /* erasure=core::int, declared=! */ {
  lowered final self::E% /* erasure=core::int, declared=! */ #this = _e;
  return #this;
}
static extension-type-member method E|constructor#_#new#tearOff(core::int _e) → self::E% /* erasure=core::int, declared=! */
  return self::E|constructor#(_e);
static extension-type-member method E|methodC(lowered final self::E% /* erasure=core::int, declared=! */ #this) → dynamic
  return #this as{Unchecked} core::int;
static extension-type-member method E|get#methodC(lowered final self::E% /* erasure=core::int, declared=! */ #this) → () → dynamic
  return () → dynamic => self::E|methodC(#this);
static extension-type-member method G|constructor#<T extends core::Object? = dynamic>(self::G|constructor#::T% g) → self::G<self::G|constructor#::T%>% /* erasure=self::G|constructor#::T%, declared=! */ {
  lowered final self::G<self::G|constructor#::T%>% /* erasure=self::G|constructor#::T%, declared=! */ #this = g;
  return #this;
}
static extension-type-member method G|constructor#_#new#tearOff<T extends core::Object? = dynamic>(self::G|constructor#_#new#tearOff::T% g) → self::G<self::G|constructor#_#new#tearOff::T%>% /* erasure=self::G|constructor#_#new#tearOff::T%, declared=! */
  return self::G|constructor#<self::G|constructor#_#new#tearOff::T%>(g);
static extension-type-member method H|constructor#<T extends core::Object? = dynamic>(core::List<self::H|constructor#::T%> h) → self::H<self::H|constructor#::T%>% /* erasure=core::List<self::H|constructor#::T%>, declared=! */ {
  lowered final self::H<self::H|constructor#::T%>% /* erasure=core::List<self::H|constructor#::T%>, declared=! */ #this = h;
  return #this;
}
static extension-type-member method H|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<self::H|constructor#_#new#tearOff::T%> h) → self::H<self::H|constructor#_#new#tearOff::T%>% /* erasure=core::List<self::H|constructor#_#new#tearOff::T%>, declared=! */
  return self::H|constructor#<self::H|constructor#_#new#tearOff::T%>(h);
static method main() → dynamic {
  self::A% /* erasure=core::int, declared=! */ a = self::A|constructor#(42);
  self::expect(42, a as{Unchecked} core::int);
  self::B% /* erasure=core::int, declared=! */ b = self::B|constructor#(87);
  self::expect(87, b as{Unchecked} core::int);
  self::expect(87, b as{Unchecked} core::int);
  self::expect(87, self::B|methodA(b));
  self::expect(87, self::B|methodB(b));
  self::C% /* erasure=core::int, declared=! */ c = self::C|constructor#(123);
  self::expect(123, c as{Unchecked} core::int);
  inh::D% /* erasure=core::int, declared=! */ d = inh::D|constructor#(442);
  self::expect(442, d as{Unchecked} core::int);
  self::E% /* erasure=core::int, declared=! */ e = self::E|constructor#(872);
  self::expect(872, e as{Unchecked} core::int);
  self::expect(872, e as{Unchecked} core::int);
  self::expect(872, self::E|methodC(e));
  inh::F% /* erasure=core::int, declared=! */ f = inh::F|constructor#(1023);
  self::expect(1023, f as{Unchecked} core::int);
  self::expect(1023, f as{Unchecked} core::int);
  self::expect(1023, self::E|methodC(f));
  self::expect(1023, inh::F|methodD(f));
  self::G<core::int>% /* erasure=core::int, declared=! */ g1 = self::G|constructor#<core::int>(72);
  core::int g1_g = g1 as{Unchecked} core::int;
  core::int g1_alias = g1_g;
  self::expect(72, g1 as{Unchecked} core::int);
  self::G<core::String>% /* erasure=core::String, declared=! */ g2 = self::G|constructor#<core::String>("72");
  core::String g2_g = g2 as{Unchecked} core::String;
  core::String g2_alias = g2_g;
  self::expect("72", g2 as{Unchecked} core::String);
  core::List<core::int> list1 = <core::int>[97];
  self::H<core::int>% /* erasure=core::List<core::int>, declared=! */ h1 = self::H|constructor#<core::int>(list1);
  core::List<core::int> h1_g = h1 as{Unchecked} core::List<core::int>;
  core::List<core::int> h1_g_alias = h1_g;
  self::expect(list1, h1 as{Unchecked} core::List<core::int>);
  core::List<core::int> h1_h = h1 as{Unchecked} core::List<core::int>;
  core::List<core::int> h1_h_alias = h1_h;
  self::expect(list1, h1 as{Unchecked} core::List<core::int>);
  core::List<core::String> list2 = <core::String>["foo"];
  self::H<core::String>% /* erasure=core::List<core::String>, declared=! */ h2 = self::H|constructor#<core::String>(list2);
  core::List<core::String> h2_g = h2 as{Unchecked} core::List<core::String>;
  core::List<core::String> h2_g_alias = h2_g;
  self::expect(list2, h2 as{Unchecked} core::List<core::String>);
  core::List<core::String> h2_h = h2 as{Unchecked} core::List<core::String>;
  core::List<core::String> h2_h_alias = h2_h;
  self::expect(list2, h2 as{Unchecked} core::List<core::String>);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

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

import "org-dartlang-testcase:///inherited_representation_field.dart";

extension type D(core::int _d) implements #lib1::C% /* erasure=core::int, declared=! */ {
  abstract extension-type-member representation-field get _d() → core::int;
  constructor • = inh::D|constructor#;
  constructor tearoff • = inh::D|constructor#_#new#tearOff;
}
extension type F(core::int _f) implements #lib1::E% /* erasure=core::int, declared=! */ {
  abstract extension-type-member representation-field get _f() → core::int;
  method methodD = inh::F|methodD;
  method tearoff methodD = inh::F|get#methodD;
  constructor • = inh::F|constructor#;
  constructor tearoff • = inh::F|constructor#_#new#tearOff;
}
static extension-type-member method D|constructor#(core::int _d) → inh::D% /* erasure=core::int, declared=! */ {
  lowered final inh::D% /* erasure=core::int, declared=! */ #this = _d;
  return #this;
}
static extension-type-member method D|constructor#_#new#tearOff(core::int _d) → inh::D% /* erasure=core::int, declared=! */
  return inh::D|constructor#(_d);
static extension-type-member method F|constructor#(core::int _f) → inh::F% /* erasure=core::int, declared=! */ {
  lowered final inh::F% /* erasure=core::int, declared=! */ #this = _f;
  return #this;
}
static extension-type-member method F|constructor#_#new#tearOff(core::int _f) → inh::F% /* erasure=core::int, declared=! */
  return inh::F|constructor#(_f);
static extension-type-member method F|methodD(lowered final inh::F% /* erasure=core::int, declared=! */ #this) → dynamic
  return #this as{Unchecked} core::int;
static extension-type-member method F|get#methodD(lowered final inh::F% /* erasure=core::int, declared=! */ #this) → () → dynamic
  return () → dynamic => inh::F|methodD(#this);
