@#C2
library static_interop;
import self as self;
import "dart:js_interop" as js_;
import "dart:_js_annotations" as _js;
import "dart:core" as core;

import "dart:js_interop";

@#C2
@#C3
class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  static method _#new#tearOff() → self::A
    return new self::A::•();
}
@#C2
inline class B /* declaredRepresentationType = self::A */ {
  get field = self::B|get#field;
  set field = self::B|set#field;
  method method = self::B|method;
  tearoff method = self::B|get#method;
  method genericMethod = self::B|genericMethod;
  tearoff genericMethod = self::B|get#genericMethod;
  get getter = self::B|get#getter;
  static get staticField = get self::B|staticField;
  static set staticField = set self::B|staticField;
  static method staticMethod = self::B|staticMethod;
  static method staticGenericMethod = self::B|staticGenericMethod;
  static get staticGetter = get self::B|staticGetter;
  set setter = self::B|set#setter;
  static set staticSetter = set self::B|staticSetter;
  constructor • = self::B|;
  tearoff • = self::B|_#new#tearOff;
  constructor named = self::B|named;
  tearoff named = self::B|_#named#tearOff;
}
external static inline-class-member method B|(self::A a) → self::B;
static inline-class-member method B|_#new#tearOff(self::A a) → self::B
  return self::B|(a);
external static inline-class-member method B|named(core::int i) → self::B;
static inline-class-member method B|_#named#tearOff(core::int i) → self::B
  return self::B|named(i);
external static inline-class-member method B|get#field(lowered self::A #this) → self::A;
external static inline-class-member method B|set#field(lowered self::A #this, self::A #externalFieldValue) → void;
external static inline-class-member method B|method(lowered final self::B #this) → self::A;
static inline-class-member method B|get#method(lowered final self::B #this) → () → self::A
  return () → self::A => self::B|method(#this);
external static inline-class-member method B|genericMethod<T extends core::Object? = dynamic>(lowered final self::B #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
static inline-class-member method B|get#genericMethod(lowered final self::B #this) → <T extends core::Object? = dynamic>(T%) → T%
  return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
external static inline-class-member method B|get#getter(lowered final self::B #this) → self::B;
external static inline-class-member method B|set#setter(lowered final self::B #this, self::B b) → void;
external static inline-class-member get B|staticField() → self::A;
external static inline-class-member set B|staticField(self::A #externalFieldValue) → void;
external static inline-class-member method B|staticMethod() → self::A;
external static inline-class-member method B|staticGenericMethod<T extends core::Object? = dynamic>(self::B|staticGenericMethod::T% t) → self::B|staticGenericMethod::T%;
external static inline-class-member get B|staticGetter() → self::B;
external static inline-class-member set B|staticSetter(self::B b) → void;
static method method(self::A a) → void {
  self::B b1 = self::B|(a);
  self::B b2 = self::B|named(0);
  a = self::B|get#field(b1);
  self::B|set#field(b1, a);
  a = self::B|method(b1);
  b2 = self::B|genericMethod<self::B>(b2, b2);
  b1 = self::B|get#getter(b2);
  self::B|set#setter(b1, b2);
  a = self::B|staticField;
  self::B|staticField = a;
  a = self::B|staticMethod();
  b2 = self::B|staticGenericMethod<self::B>(b2);
  b1 = self::B|staticGetter;
  self::B|staticSetter = b2;
}

constants  {
  #C1 = null
  #C2 = js_::JS {name:#C1}
  #C3 = _js::_StaticInterop {}
}


Constructor coverage from constants:
org-dartlang-testcase:///external.dart:
- JS. (from org-dartlang-sdk:///lib/js_interop/js_interop.dart)
- Object. (from org-dartlang-sdk:///lib/core/object.dart)
