library;
import self as self;

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

static method main() → dynamic
  ;
static method errors() → dynamic
  ;

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

extension _PrivateExtension on core::String* {
  method publicMethod1 = self2::_PrivateExtension|publicMethod1;
  tearoff publicMethod1 = self2::_PrivateExtension|get#publicMethod1;
  method _privateMethod1 = self2::_PrivateExtension|_privateMethod1;
  tearoff _privateMethod1 = self2::_PrivateExtension|get#_privateMethod1;
  static method publicStaticMethod1 = self2::_PrivateExtension|publicStaticMethod1;
  static method _privateStaticMethod1 = self2::_PrivateExtension|_privateStaticMethod1;
  method test1 = self2::_PrivateExtension|test1;
  tearoff test1 = self2::_PrivateExtension|get#test1;
}
extension PublicExtension on core::String* {
  method publicMethod2 = self2::PublicExtension|publicMethod2;
  tearoff publicMethod2 = self2::PublicExtension|get#publicMethod2;
  method _privateMethod2 = self2::PublicExtension|_privateMethod2;
  tearoff _privateMethod2 = self2::PublicExtension|get#_privateMethod2;
  static method publicStaticMethod2 = self2::PublicExtension|publicStaticMethod2;
  static method _privateStaticMethod2 = self2::PublicExtension|_privateStaticMethod2;
  method test2 = self2::PublicExtension|test2;
  tearoff test2 = self2::PublicExtension|get#test2;
}
extension _extension#0 on core::String* {
  method publicMethod3 = self2::_extension#0|publicMethod3;
  tearoff publicMethod3 = self2::_extension#0|get#publicMethod3;
  method _privateMethod3 = self2::_extension#0|_privateMethod3;
  tearoff _privateMethod3 = self2::_extension#0|get#_privateMethod3;
  static method publicStaticMethod3 = self2::_extension#0|publicStaticMethod3;
  static method _privateStaticMethod3 = self2::_extension#0|_privateStaticMethod3;
  method test3 = self2::_extension#0|test3;
  tearoff test3 = self2::_extension#0|get#test3;
}
static method _PrivateExtension|publicMethod1(lowered final core::String* #this) → core::int*
  ;
static method _PrivateExtension|get#publicMethod1(lowered final core::String* #this) → () →* core::int*
  return () → core::int* => self2::_PrivateExtension|publicMethod1(#this);
static method _PrivateExtension|_privateMethod1(lowered final core::String* #this) → core::int*
  ;
static method _PrivateExtension|get#_privateMethod1(lowered final core::String* #this) → () →* core::int*
  return () → core::int* => self2::_PrivateExtension|_privateMethod1(#this);
static method _PrivateExtension|publicStaticMethod1() → core::int*
  ;
static method _PrivateExtension|_privateStaticMethod1() → core::int*
  ;
static method _PrivateExtension|test1(lowered final core::String* #this) → dynamic
  ;
static method _PrivateExtension|get#test1(lowered final core::String* #this) → () →* dynamic
  return () → dynamic => self2::_PrivateExtension|test1(#this);
static method PublicExtension|publicMethod2(lowered final core::String* #this) → core::int*
  ;
static method PublicExtension|get#publicMethod2(lowered final core::String* #this) → () →* core::int*
  return () → core::int* => self2::PublicExtension|publicMethod2(#this);
static method PublicExtension|_privateMethod2(lowered final core::String* #this) → core::int*
  ;
static method PublicExtension|get#_privateMethod2(lowered final core::String* #this) → () →* core::int*
  return () → core::int* => self2::PublicExtension|_privateMethod2(#this);
static method PublicExtension|publicStaticMethod2() → core::int*
  ;
static method PublicExtension|_privateStaticMethod2() → core::int*
  ;
static method PublicExtension|test2(lowered final core::String* #this) → dynamic
  ;
static method PublicExtension|get#test2(lowered final core::String* #this) → () →* dynamic
  return () → dynamic => self2::PublicExtension|test2(#this);
static method _extension#0|publicMethod3(lowered final core::String* #this) → core::int*
  ;
static method _extension#0|get#publicMethod3(lowered final core::String* #this) → () →* core::int*
  return () → core::int* => self2::_extension#0|publicMethod3(#this);
static method _extension#0|_privateMethod3(lowered final core::String* #this) → core::int*
  ;
static method _extension#0|get#_privateMethod3(lowered final core::String* #this) → () →* core::int*
  return () → core::int* => self2::_extension#0|_privateMethod3(#this);
static method _extension#0|publicStaticMethod3() → core::int*
  ;
static method _extension#0|_privateStaticMethod3() → core::int*
  ;
static method _extension#0|test3(lowered final core::String* #this) → dynamic
  ;
static method _extension#0|get#test3(lowered final core::String* #this) → () →* dynamic
  return () → dynamic => self2::_extension#0|test3(#this);
static method test() → dynamic
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;
