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
    : super core::Object::•()
    ;
  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 = 1;
  field core::int _privateFinalField = 1;
  static final field dynamic _redirecting# = <dynamic>[self::_Class::_privateRedirectingFactory]/*isLegacy*/;
  constructor _privateConstructor() → self::_Class
    : super core::Object::•()
    ;
  static factory _privateRedirectingFactory() → self::_Class
    let dynamic #redirecting_factory = self::_Class::_privateConstructor in invalid-expression;
  method _privateMethod() → void {}
  get _privateGetter() → core::int
    return 42;
  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 = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
static field core::int _Extension|_privateFinalField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
static method test(self::_AbstractClass c) → dynamic {
  c.{self::_AbstractClass::_privateAbstractField} = c.{self::_AbstractClass::_privateAbstractField};
}
static method main() → dynamic {
  self::_Class c = new self::_Class::_privateConstructor();
  c = new self::_Class::_privateConstructor();
  c.{self::_Class::_privateMethod}();
  c.{self::_Class::_privateSetter} = c.{self::_Class::_privateGetter};
  c.{self::_Class::_privateField} = c.{self::_Class::_privateField};
  c.{self::_Class::_privateFinalField};
  self::_Extension|_privateMethod(0);
  self::_Extension|get#_privateMethod(0).call();
  self::_Extension|set#_privateSetter(0, self::_Extension|get#_privateGetter(0));
  self::_Extension|_privateField = self::_Extension|_privateField;
  self::_Extension|_privateFinalField;
}
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
  return 42;
static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}
