library;
import self as self;

import "dart:test";

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

library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/inject_public/patch_lib.dart:8:7: Error: Can't inject public 'InjectedClass' into 'dart:test'.
// Make 'InjectedClass' private, or make sure injected library has "dart" scheme and is private (e.g. "dart:_internal").
// class InjectedClass {} // Error
//       ^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/inject_public/patch_lib.dart:10:1: Error: Can't inject public 'injectedMethod' into 'dart:test'.
// Make 'injectedMethod' private, or make sure injected library has "dart" scheme and is private (e.g. "dart:_internal").
// injectedMethod() {} // Error
// ^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/inject_public/patch_lib.dart:15:10: Error: Can't inject public 'staticInjectedMethod' into 'dart:test'.
// Make 'staticInjectedMethod' private, or make sure injected library has "dart" scheme and is private (e.g. "dart:_internal").
//   static staticInjectedMethod() {} // Error
//          ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/inject_public/patch_lib.dart:21:10: Error: Can't inject public 'staticInjectedMethod' into 'dart:test'.
// Make 'staticInjectedMethod' private, or make sure injected library has "dart" scheme and is private (e.g. "dart:_internal").
//   static staticInjectedMethod() {} // Error
//          ^^^^^^^^^^^^^^^^^^^^
//
import self as self2;
import "dart:_internal" as _in;
import "dart:core" as core;

import "dart:_internal";

@/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
class Class extends core::Object {
  synthetic constructor •() → self2::Class
    ;
  method /* from org-dartlang-testcase:///patch_lib.dart */ injectedMethod() → dynamic
    ;
  static method /* from org-dartlang-testcase:///patch_lib.dart */ staticInjectedMethod() → dynamic
    ;
}
@/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
class _PrivateClass extends core::Object {
  synthetic constructor •() → self2::_PrivateClass
    ;
  method /* from org-dartlang-testcase:///patch_lib.dart */ injectedMethod() → dynamic
    ;
  static method /* from org-dartlang-testcase:///patch_lib.dart */ staticInjectedMethod() → dynamic
    ;
}
class InjectedClass extends core::Object { // from org-dartlang-testcase:///patch_lib.dart
  synthetic constructor •() → self2::InjectedClass
    ;
}
class _PrivateInjectedClass extends core::Object { // from org-dartlang-testcase:///patch_lib.dart
  synthetic constructor •() → self2::_PrivateInjectedClass
    ;
  method publicMethod() → dynamic
    ;
}
@/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
extension Extension on core::int {
  method injectedMethod = self2::Extension|injectedMethod;
  method tearoff injectedMethod = self2::Extension|get#injectedMethod;
  static method staticInjectedMethod = self2::Extension|staticInjectedMethod;
}
@/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
extension _PrivateExtension on core::int {
  method injectedMethod = self2::_PrivateExtension|injectedMethod;
  method tearoff injectedMethod = self2::_PrivateExtension|get#injectedMethod;
  static method staticInjectedMethod = self2::_PrivateExtension|staticInjectedMethod;
}
extension _PrivateInjectedExtension on core::int { // from org-dartlang-testcase:///patch_lib.dart
  method publicMethod = self2::_PrivateInjectedExtension|publicMethod;
  method tearoff publicMethod = self2::_PrivateInjectedExtension|get#publicMethod;
}
static method /* from org-dartlang-testcase:///patch_lib.dart */ injectedMethod() → dynamic
  ;
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ Extension|injectedMethod(lowered final core::int #this) → dynamic
  ;
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ Extension|get#injectedMethod(lowered final core::int #this) → () → dynamic
  return () → dynamic => self2::Extension|injectedMethod(#this);
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ Extension|staticInjectedMethod() → dynamic
  ;
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ _PrivateInjectedExtension|publicMethod(lowered final core::int #this) → dynamic
  ;
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ _PrivateInjectedExtension|get#publicMethod(lowered final core::int #this) → () → dynamic
  return () → dynamic => self2::_PrivateInjectedExtension|publicMethod(#this);
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ _PrivateExtension|injectedMethod(lowered final core::int #this) → dynamic
  ;
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ _PrivateExtension|get#injectedMethod(lowered final core::int #this) → () → dynamic
  return () → dynamic => self2::_PrivateExtension|injectedMethod(#this);
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ _PrivateExtension|staticInjectedMethod() → dynamic
  ;


Extra constant evaluation status:
Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:12:1 -> InstanceConstant(const _Patch{})
Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:32:1 -> InstanceConstant(const _Patch{})
Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:18:1 -> InstanceConstant(const _Patch{})
Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:38:1 -> InstanceConstant(const _Patch{})
Extra constant evaluation: evaluated: 13, effectively constant: 4
