library;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/deferred_explicit_access.dart:5:1: Error: Extension 'Extension' cannot be imported through a deferred import.
// Try adding the `hide Extension` to the import.
// import 'deferred_explicit_access_lib.dart' deferred as prefix;
// ^
//
import self as self;

import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;

static method main() → dynamic async 
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;

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

extension Extension on core::int* {
  static field staticField = self2::Extension|staticField;
  static get staticProperty = get self2::Extension|staticProperty;
  static method staticMethod = self2::Extension|staticMethod;
  get property = self2::Extension|get#property;
  method method = self2::Extension|method;
  tearoff method = self2::Extension|get#method;
  static set staticProperty = set self2::Extension|staticProperty;
  set property = self2::Extension|set#property;
}
static field core::int* Extension|staticField;
static field core::int* topLevelField;
static get Extension|staticProperty() → core::int*
  ;
static set Extension|staticProperty(core::int* value) → void
  ;
static method Extension|staticMethod() → core::int*
  ;
static method Extension|get#property(lowered final core::int* #this) → core::int*
  ;
static method Extension|set#property(lowered final core::int* #this, core::int* value) → void
  ;
static method Extension|method(lowered final core::int* #this) → core::int*
  ;
static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
  return () → core::int* => self2::Extension|method(#this);
static get topLevelProperty() → core::int*
  ;
static set topLevelProperty(core::int* value) → void
  ;
static method topLevelMethod() → dynamic
  ;
