library;
import self as self;

import "dart:test";

static method main() → dynamic
  ;

library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/patch_getter/patch_lib.dart:29:1: Error: Can't inject public 'methodInPatch' into 'dart:test'.
// Make 'methodInPatch' private, or make sure injected library has "dart" scheme and is private (e.g. "dart:_internal").
// methodInPatch() {
// ^
//
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 {
  constructor •() → self2::Class
    ;
  @_in::patch
  external get instanceGetter() → core::int;
  @_in::patch
  external static get staticGetter() → core::int;
}
@_in::patch
extension Extension on core::int {
  get instanceGetter = self2::Extension|get#instanceGetter;
  static get staticGetter = get self2::Extension|staticGetter;
}
@_in::patch
external static get topLevelGetter() → core::int;
@_in::patch
external static extension-member method Extension|get#instanceGetter(lowered final core::int #this) → core::int;
@_in::patch
external static extension-member get Extension|staticGetter() → core::int;
static method methodInOrigin() → dynamic
  ;
static method /* from org-dartlang-testcase:///patch_lib.dart */ methodInPatch() → dynamic
  ;


Extra constant evaluation status:
Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:11:1 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:12:28 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:15:27 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:18:9 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:10:3 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:21:4 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:23:9 -> InstanceConstant(const _Patch{})
Extra constant evaluation: evaluated: 7, effectively constant: 7
