library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class Annotation extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::Annotation
    : super core::Object::•()
    ;
}
class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  @#C1
  external get instanceField() → core::int;
  @#C1
  external set instanceField(core::int #externalFieldValue) → void;
  @#C1
  external get finalInstanceField() → core::int;
  @#C1
  external get covariantInstanceField() → core::num;
  @#C1
  external set covariantInstanceField(covariant-by-declaration core::num #externalFieldValue) → void;
  @#C1
  external static get staticField() → core::int;
  @#C1
  external static set staticField(core::int #externalFieldValue) → void;
  @#C1
  external static get finalStaticField() → core::int;
  external get untypedInstanceField() → dynamic;
  external set untypedInstanceField(dynamic #externalFieldValue) → void;
  external get untypedFinalInstanceField() → dynamic;
  external get untypedCovariantInstanceField() → dynamic;
  external set untypedCovariantInstanceField(covariant-by-declaration dynamic #externalFieldValue) → void;
  external static get untypedStaticField() → dynamic;
  external static set untypedStaticField(dynamic #externalFieldValue) → void;
  external static get untypedFinalStaticField() → dynamic;
}
abstract class B extends core::Object /*isMixinDeclaration*/  {
  @#C1
  external get instanceField() → core::int;
  @#C1
  external set instanceField(core::int #externalFieldValue) → void;
  @#C1
  external get finalInstanceField() → core::int;
  @#C1
  external get covariantInstanceField() → core::num;
  @#C1
  external set covariantInstanceField(covariant-by-declaration core::num #externalFieldValue) → void;
  @#C1
  external static get staticField() → core::int;
  @#C1
  external static set staticField(core::int #externalFieldValue) → void;
  @#C1
  external static get finalStaticField() → core::int;
  external get untypedInstanceField() → dynamic;
  external set untypedInstanceField(dynamic #externalFieldValue) → void;
  external get untypedFinalInstanceField() → dynamic;
  external get untypedCovariantInstanceField() → dynamic;
  external set untypedCovariantInstanceField(covariant-by-declaration dynamic #externalFieldValue) → void;
  external static get untypedStaticField() → dynamic;
  external static set untypedStaticField(dynamic #externalFieldValue) → void;
  external static get untypedFinalStaticField() → dynamic;
}
class C extends core::Object implements self::A {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  external get instanceField() → core::int;
  external set instanceField(core::int #externalFieldValue) → void;
  external get finalInstanceField() → core::int;
  external get covariantInstanceField() → core::num;
  external set covariantInstanceField(covariant-by-declaration core::num #externalFieldValue) → void;
  external get untypedInstanceField() → dynamic;
  external set untypedInstanceField(dynamic #externalFieldValue) → void;
  external get untypedFinalInstanceField() → dynamic;
  external get untypedCovariantInstanceField() → dynamic;
  external set untypedCovariantInstanceField(covariant-by-declaration dynamic #externalFieldValue) → void;
}
extension Extension on self::A {
  get extensionInstanceField = self::Extension|get#extensionInstanceField;
  set extensionInstanceField = self::Extension|set#extensionInstanceField;
  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
  static get extensionStaticField = get self::Extension|extensionStaticField;
  static set extensionStaticField = set self::Extension|extensionStaticField;
  static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
  get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
  set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
  get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
  static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
  static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
  static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
}
@#C1
external static get topLevelField() → core::int;
@#C1
external static set topLevelField(core::int #externalFieldValue) → void;
@#C1
external static get finalTopLevelField() → core::int;
external static get untypedTopLevelField() → dynamic;
external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
external static get untypedFinalTopLevelField() → dynamic;
@#C1
external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
@#C1
external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
@#C1
external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
@#C1
external static get Extension|extensionStaticField() → core::int;
@#C1
external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
@#C1
external static get Extension|finalExtensionStaticField() → core::int;
external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
external static get Extension|untypedExtensionStaticField() → dynamic;
external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
external static get Extension|untypedFinalExtensionStaticField() → dynamic;
static method main() → dynamic {}

constants  {
  #C1 = self::Annotation {}
}


Constructor coverage from constants:
org-dartlang-testcase:///external_fields.dart:
- Annotation. (from org-dartlang-testcase:///external_fields.dart:6:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
