library /*isNonNullableByDefault*/;
import self as self;

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

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

library /*isNonNullableByDefault*/;
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
  ;
