library;
import self as self;

import "dart:test";

static method test() → dynamic
  ;

library;
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
extension IntExtension on core::int {
  method method1 = self2::IntExtension|method1;
  method tearoff method1 = self2::IntExtension|get#method1;
  method method2 = self2::IntExtension|method2;
  method tearoff method2 = self2::IntExtension|get#method2;
}
@/* from org-dartlang-testcase:///patch_lib.dart */ _in::patch
extension GenericExtension<T extends core::Object? = dynamic> on T% {
  method method3 = self2::GenericExtension|method3;
  method tearoff method3 = self2::GenericExtension|get#method3;
  method method4 = self2::GenericExtension|method4;
  method tearoff method4 = self2::GenericExtension|get#method4;
}
static method method1() → dynamic
  ;
@_in::patch
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ IntExtension|method1(lowered final core::int #this) → core::int
  ;
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ IntExtension|get#method1(lowered final core::int #this) → () → core::int
  return () → core::int => self2::IntExtension|method1(#this);
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ IntExtension|method2(lowered final core::int #this) → core::int
  ;
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ IntExtension|get#method2(lowered final core::int #this) → () → core::int
  return () → core::int => self2::IntExtension|method2(#this);
@_in::patch
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ GenericExtension|method3<T extends core::Object? = dynamic>(lowered final self2::GenericExtension|method3::T% #this) → core::int
  ;
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ GenericExtension|get#method3<T extends core::Object? = dynamic>(lowered final self2::GenericExtension|get#method3::T% #this) → () → core::int
  return () → core::int => self2::GenericExtension|method3<self2::GenericExtension|get#method3::T%>(#this);
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ GenericExtension|method4<T extends core::Object? = dynamic>(lowered final self2::GenericExtension|method4::T% #this) → core::int
  ;
static extension-member method /* from org-dartlang-testcase:///patch_lib.dart */ GenericExtension|get#method4<T extends core::Object? = dynamic>(lowered final self2::GenericExtension|get#method4::T% #this) → () → core::int
  return () → core::int => self2::GenericExtension|method4<self2::GenericExtension|get#method4::T%>(#this);
static method /* from org-dartlang-testcase:///patch_lib.dart */ _method2() → dynamic
  ;


Extra constant evaluation status:
Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:8:1 -> InstanceConstant(const _Patch{})
Evaluated: FileUriExpression @ org-dartlang-testcase:///patch_lib.dart:16:1 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:10:4 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:18:4 -> InstanceConstant(const _Patch{})
Extra constant evaluation: evaluated: 16, effectively constant: 4
