library;
import self as self;

import "org-dartlang-testcase:///main_lib1.dart";

static method main() → dynamic
  ;

library;
import self as self2;
import "main_lib2.dart" as mai;
additionalExports = (mai::Extension)

export "org-dartlang-testcase:///main_lib2.dart";


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

extension Extension on core::int* {
  get instanceProperty = mai::Extension|get#instanceProperty;
  method instanceMethod = mai::Extension|instanceMethod;
  tearoff instanceMethod = mai::Extension|get#instanceMethod;
  static field staticField = mai::Extension|staticField;
  static field staticFinalField = mai::Extension|staticFinalField;
  static field staticConstField = mai::Extension|staticConstField;
  static get staticProperty = get mai::Extension|staticProperty;
  static method staticMethod = mai::Extension|staticMethod;
  set instanceProperty = mai::Extension|set#instanceProperty;
  static set staticProperty = set mai::Extension|staticProperty;
}
static field core::int* Extension|staticField;
static final field core::int* Extension|staticFinalField;
static const field core::int* Extension|staticConstField = #C1;
static method Extension|get#instanceProperty(lowered final core::int* #this) → core::int*
  ;
static method Extension|set#instanceProperty(lowered final core::int* #this, core::int* value) → void
  ;
static method Extension|instanceMethod(lowered final core::int* #this) → void
  ;
static method Extension|get#instanceMethod(lowered final core::int* #this) → () →* void
  return () → void => mai::Extension|instanceMethod(#this);
static get Extension|staticProperty() → core::int*
  ;
static set Extension|staticProperty(core::int* value) → void
  ;
static method Extension|staticMethod() → void
  ;

constants  {
  #C1 = 42
}
