main = main::main;
library from "package:js/js.dart" as js {

  class JS extends dart.core::Object /*hasConstConstructor*/  {
    final field dart.core::String? name;
    const constructor •([dart.core::String? name = #C1]) → js::JS
      : js::JS::name = name, super dart.core::Object::•()
      ;
    static method _#new#tearOff([dart.core::String? name = #C1]) → js::JS
      return new js::JS::•(name);
  }
  class _StaticInterop extends dart.core::Object /*hasConstConstructor*/  {
    const constructor •() → js::_StaticInterop
      : super dart.core::Object::•()
      ;
    static method _#new#tearOff() → js::_StaticInterop
      return new js::_StaticInterop::•();
  }
  static const field js::_StaticInterop staticInterop = #C2;
}
library from "org-dartlang-test:///lib1.dart" as lib1 {

  import "org-dartlang-test:///lib2.dart";

  class Class extends dart.core::Object {
    synthetic constructor •() → lib1::Class
      : super dart.core::Object::•()
      ;
    method instanceMethod() → dart._interceptors::JavaScriptObject
      return sta::StaticJSClass::factory|staticInteropFactoryStub();
    get instanceGetter() → dart._interceptors::JavaScriptObject
      return new sta::StaticJSClass::•() as dart._interceptors::JavaScriptObject;
    set instanceSetter((dart._interceptors::JavaScriptObject) → void f) → void {}
    static method staticMethod() → dart._interceptors::JavaScriptObject
      return sta::StaticJSClass::factory|staticInteropFactoryStub();
    static get staticGetter() → dart._interceptors::JavaScriptObject
      return new sta::StaticJSClass::•() as dart._interceptors::JavaScriptObject;
    static set staticSetter((dart._interceptors::JavaScriptObject) → void f) → void {}
    static method _#new#tearOff() → lib1::Class
      return new lib1::Class::•();
  }
  static method topLevelMethod() → dart._interceptors::JavaScriptObject
    return new sta::StaticJSClass::•() as dart._interceptors::JavaScriptObject;
  static get topLevelGetter() → dart._interceptors::JavaScriptObject
    return new sta::StaticJSClass::•() as dart._interceptors::JavaScriptObject;
  static set topLevelSetter((dart._interceptors::JavaScriptObject) → void f) → void {}
}
@#C3
library static_interop from "org-dartlang-test:///lib2.dart" as sta {

  import "package:js/js.dart";

  @#C5
  @#C2
  class StaticJSClass extends dart.core::Object {
    external constructor •() → sta::StaticJSClass
      : super dart.core::Object::•()
      ;
    static method _#new#tearOff() → dart._interceptors::JavaScriptObject
      return new sta::StaticJSClass::•() as dart._interceptors::JavaScriptObject;
    static factory factory() → sta::StaticJSClass {
      return new sta::StaticJSClass::•();
    }
    static method _#factory#tearOff() → dart._interceptors::JavaScriptObject
      return sta::StaticJSClass::factory|staticInteropFactoryStub();
    static method /*isLegacy*/ factory|staticInteropFactoryStub() → dart._interceptors::JavaScriptObject {
      return (new sta::StaticJSClass::•() as dart._interceptors::JavaScriptObject) as dart._interceptors::JavaScriptObject;
    }
  }
  @#C3
  external static method eval(dart.core::String code) → void;
  static method setUp() → void {
    sta::eval("function JSClass() {}");
  }
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///lib1.dart";
  import "org-dartlang-test:///lib2.dart";

  class Subclass extends lib1::Class {
    synthetic constructor •() → main::Subclass
      : super lib1::Class::•()
      ;
    method method() → void {
      dart._interceptors::JavaScriptObject baz = super.{lib1::Class::instanceMethod}();
      () → dart._interceptors::JavaScriptObject bazFunction = super.{lib1::Class::instanceMethod};
      baz = super.{lib1::Class::instanceGetter};
      super.{lib1::Class::instanceSetter} = (dart._interceptors::JavaScriptObject s) → void {};
    }
    static method _#new#tearOff() → main::Subclass
      return new main::Subclass::•();
  }
  static method main() → dynamic {
    dart._interceptors::JavaScriptObject foo = lib1::topLevelMethod();
    () → dart._interceptors::JavaScriptObject fooFunction = #C6;
    foo = lib1::topLevelGetter;
    lib1::topLevelSetter = (dart._interceptors::JavaScriptObject s) → void {};
    dart._interceptors::JavaScriptObject bar = lib1::Class::staticMethod();
    () → dart._interceptors::JavaScriptObject barFunction = #C7;
    bar = lib1::Class::staticGetter;
    lib1::Class::staticSetter = (dart._interceptors::JavaScriptObject s) → void {};
    lib1::Class c = new lib1::Class::•();
    dart._interceptors::JavaScriptObject baz = c.{lib1::Class::instanceMethod}(){() → dart._interceptors::JavaScriptObject};
    () → dart._interceptors::JavaScriptObject bazFunction = c.{lib1::Class::instanceMethod}{() → dart._interceptors::JavaScriptObject};
    baz = c.{lib1::Class::instanceGetter}{dart._interceptors::JavaScriptObject};
    c.{lib1::Class::instanceSetter} = (dart._interceptors::JavaScriptObject s) → void {};
  }
}
constants  {
  #C1 = null
  #C2 = js::_StaticInterop {}
  #C3 = js::JS {name:#C1}
  #C4 = "JSClass"
  #C5 = js::JS {name:#C4}
  #C6 = static-tearoff lib1::topLevelMethod
  #C7 = static-tearoff lib1::Class::staticMethod
}


Constructor coverage from constants:
org-dartlang-test:///lib2.dart:
- JS. (from org-dartlang-test:///js/lib/js.dart:3:9)
- Object. (from org-dartlang-sdk:///lib/core/object.dart)

org-dartlang-test:///js/lib/js.dart:
- _StaticInterop. (from org-dartlang-test:///js/lib/js.dart:6:9)
- Object. (from org-dartlang-sdk:///lib/core/object.dart)

