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 Never #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}{core::int};
}
static method main() → dynamic {
  self::_Class c = new self::_Class::_privateConstructor();
  c = new self::_Class::_privateConstructor();
  c.{self::_Class::_privateMethod}(){() → void};
  c.{self::_Class::_privateSetter} = c.{self::_Class::_privateGetter}{core::int};
  c.{self::_Class::_privateField} = c.{self::_Class::_privateField}{core::int};
  c.{self::_Class::_privateFinalField}{core::int};
  self::_Extension|_privateMethod(0);
  self::_Extension|get#_privateMethod(0)(){() → void};
  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 {}
