library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

part private_members_part.dart;
abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
  synthetic constructor •() → self::_AbstractClass
    ;
  abstract get _privateAbstractField() → core::int;
  abstract set _privateAbstractField(core::int #externalFieldValue) → void;
}
class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
  field core::int _privateField;
  field core::int _privateFinalField;
  static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
  constructor _privateConstructor() → self::_Class
    ;
  static factory _privateRedirectingFactory() → self::_Class
    return new self::_Class::_privateConstructor();
  method _privateMethod() → void
    ;
  get _privateGetter() → core::int
    ;
  set _privateSetter(core::int value) → void
    ;
}
extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
  method _privateMethod = self::_Extension|_privateMethod;
  tearoff _privateMethod = self::_Extension|get#_privateMethod;
  get _privateGetter = self::_Extension|get#_privateGetter;
  static field _privateField = self::_Extension|_privateField;
  static field _privateFinalField = self::_Extension|_privateFinalField;
  set _privateSetter = self::_Extension|set#_privateSetter;
}
static field core::int _Extension|_privateField /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int _Extension|_privateFinalField /* from org-dartlang-testcase:///private_members_part.dart */;
static method test(self::_AbstractClass c) → dynamic
  ;
static method main() → dynamic
  ;
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void
  ;
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
  return () → void => self::_Extension|_privateMethod(#this);
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
  ;
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void
  ;
