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

part issue48765_part1.dart;
part issue48765_part2.dart;
abstract class _A extends core::Object { // from org-dartlang-testcase:///issue48765_part1.dart
  synthetic constructor •() → self::_A
    : super core::Object::•()
    ;
}
class _Ac extends core::Object implements self::_A { // from org-dartlang-testcase:///issue48765_part1.dart
  synthetic constructor •() → self::_Ac
    : super core::Object::•()
    ;
}
abstract class _B extends core::Object { // from org-dartlang-testcase:///issue48765_part2.dart
  synthetic constructor •() → self::_B
    : super core::Object::•()
    ;
}
class _Bc extends core::Object implements self::_B { // from org-dartlang-testcase:///issue48765_part2.dart
  synthetic constructor •() → self::_Bc
    : super core::Object::•()
    ;
}
extension /* unnamed */ _extension#0 on self::_A { // from org-dartlang-testcase:///issue48765_part1.dart
  static field field = self::_extension#0|field;
  method method = self::_extension#0|method;
  method tearoff method = self::_extension#0|get#method;
}
extension /* unnamed */ _extension#1 on self::_B { // from org-dartlang-testcase:///issue48765_part2.dart
  static field field = self::_extension#1|field;
  method method = self::_extension#1|method;
  method tearoff method = self::_extension#1|get#method;
}
static field core::int _extension#0|field = 0 /* from org-dartlang-testcase:///issue48765_part1.dart */;
static field core::int _extension#1|field = 0 /* from org-dartlang-testcase:///issue48765_part2.dart */;
static method main() → void {
  self::_extension#0|method(new self::_Ac::•());
  self::_extension#1|method(new self::_Bc::•());
}
static extension-member method /* from org-dartlang-testcase:///issue48765_part1.dart */ _extension#0|method(lowered final self::_A #this) → void {
  self::_extension#0|field = self::_extension#0|field.{core::num::+}(1){(core::num) → core::int};
}
static extension-member method /* from org-dartlang-testcase:///issue48765_part1.dart */ _extension#0|get#method(lowered final self::_A #this) → () → void
  return () → void => self::_extension#0|method(#this);
static extension-member method /* from org-dartlang-testcase:///issue48765_part2.dart */ _extension#1|method(lowered final self::_B #this) → void {
  self::_extension#1|field = self::_extension#1|field.{core::num::+}(1){(core::num) → core::int};
}
static extension-member method /* from org-dartlang-testcase:///issue48765_part2.dart */ _extension#1|get#method(lowered final self::_B #this) → () → void
  return () → void => self::_extension#1|method(#this);
