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

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

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

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