//
// Problems outside component:
//
// pkg/front_end/testcases/dart2js/native.dart: Error: Only JS interop members may be 'external'.
// Try removing the 'external' keyword or adding a JS interop annotation.
//
library /*isLegacy*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
import "dart:_js_helper" as _js;

import "dart:_js_helper";

class Class extends core::Object {
  field dynamic instanceField;
  static field dynamic staticField = null;
  constructor generative() → self::Class*
    : self::Class::instanceField = null, super core::Object::•()
    ;
  external constructor externalGenerative() → self::Class*;
  @#C2
  external constructor nativeGenerative() → self::Class*;
  static method _#generative#tearOff() → self::Class*
    return new self::Class::generative();
  static factory fact() → self::Class*
    return null;
  static method _#fact#tearOff() → self::Class*
    return self::Class::fact();
  static method _#externalGenerative#tearOff() → self::Class*
    return new self::Class::externalGenerative();
  external static factory externalFact() → self::Class*;
  static method _#externalFact#tearOff() → self::Class*
    return self::Class::externalFact();
  static method _#nativeGenerative#tearOff() → self::Class*
    return new self::Class::nativeGenerative();
  @#C2
  external static factory nativeFact() → self::Class*;
  static method _#nativeFact#tearOff() → self::Class*
    return self::Class::nativeFact();
  get instanceGetter() → dynamic
    return null;
  set instanceSetter(dynamic _) → void {}
  method instanceMethod() → dynamic {}
  static get staticGetter() → dynamic
    return null;
  static set staticSetter(dynamic _) → void {}
  static method staticMethod() → dynamic {}
  external get externalInstanceGetter() → dynamic;
  external set externalInstanceSetter(dynamic _) → void;
  external method externalInstanceMethod() → dynamic;
  external static get externalStaticGetter() → dynamic;
  external static set externalStaticSetter(dynamic _) → void;
  external static method externalStaticMethod() → dynamic;
  @#C2
  external get nativeInstanceGetter() → dynamic;
  @#C2
  external set nativeInstanceSetter(dynamic _) → void;
  @#C2
  external method nativeInstanceMethod() → dynamic;
  @#C2
  external static get nativeStaticGetter() → dynamic;
  @#C2
  external static set nativeStaticSetter(dynamic _) → void;
  @#C2
  external static method nativeStaticMethod() → dynamic;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
@#C4
class NativeClass extends core::Object {
  field dynamic instanceField;
  static field dynamic staticField = null;
  field dynamic instanceNamedField;
  constructor generative() → self::NativeClass*
    : self::NativeClass::instanceNamedField = null, self::NativeClass::instanceField = null, super core::Object::•()
    ;
  external constructor externalGenerative() → self::NativeClass*;
  @#C2
  external constructor nativeGenerative() → self::NativeClass*;
  static method _#generative#tearOff() → self::NativeClass*
    return new self::NativeClass::generative();
  static factory fact() → self::NativeClass*
    return null;
  static method _#fact#tearOff() → self::NativeClass*
    return self::NativeClass::fact();
  static method _#externalGenerative#tearOff() → self::NativeClass*
    return new self::NativeClass::externalGenerative();
  external static factory externalFact() → self::NativeClass*;
  static method _#externalFact#tearOff() → self::NativeClass*
    return self::NativeClass::externalFact();
  static method _#nativeGenerative#tearOff() → self::NativeClass*
    return new self::NativeClass::nativeGenerative();
  @#C2
  external static factory nativeFact() → self::NativeClass*;
  static method _#nativeFact#tearOff() → self::NativeClass*
    return self::NativeClass::nativeFact();
  get instanceGetter() → dynamic
    return null;
  set instanceSetter(dynamic _) → void {}
  method instanceMethod() → dynamic {}
  static get staticGetter() → dynamic
    return null;
  static set staticSetter(dynamic _) → void {}
  static method staticMethod() → dynamic {}
  external get externalInstanceGetter() → dynamic;
  external set externalInstanceSetter(dynamic _) → void;
  external method externalInstanceMethod() → dynamic;
  external static get externalStaticGetter() → dynamic;
  external static set externalStaticSetter(dynamic _) → void;
  external static method externalStaticMethod() → dynamic;
  @#C2
  external get nativeInstanceGetter() → dynamic;
  @#C2
  external set nativeInstanceSetter(dynamic _) → void;
  @#C2
  external method nativeInstanceMethod() → dynamic;
  @#C2
  external static get nativeStaticGetter() → dynamic;
  @#C2
  external static set nativeStaticSetter(dynamic _) → void;
  @#C2
  external static method nativeStaticMethod() → dynamic;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static field dynamic topLevelField;
static get topLevelGetter() → dynamic
  return null;
static set topLevelSetter(dynamic _) → void {}
static method topLevelFunction() → dynamic {}
external static get externalTopLevelGetter() → dynamic;
external static set externalTopLevelSetter(dynamic _) → void;
external static method externalTopLevelFunction() → dynamic;
@#C2
external static get nativeTopLevelGetter() → dynamic;
@#C2
external static set nativeTopLevelSetter(dynamic _) → void;
@#C2
external static method nativeTopLevelFunction() → dynamic;
static method main() → dynamic {
  if(true)
    return;
  self::topLevelField;
  self::topLevelGetter;
  self::topLevelSetter = null;
  self::topLevelFunction();
  self::externalTopLevelGetter;
  self::externalTopLevelSetter = null;
  self::externalTopLevelFunction();
  self::nativeTopLevelGetter;
  self::nativeTopLevelSetter = null;
  self::nativeTopLevelFunction();
  self::Class* c1 = new self::Class::generative();
  self::Class::fact();
  new self::Class::externalGenerative();
  self::Class::externalFact();
  new self::Class::nativeGenerative();
  self::Class::nativeFact();
  c1.{self::Class::instanceField}{dynamic};
  c1.{self::Class::instanceGetter}{dynamic};
  c1.{self::Class::instanceSetter} = null;
  c1.{self::Class::instanceMethod}(){() →* dynamic};
  self::Class::staticField;
  self::Class::staticGetter;
  self::Class::staticSetter = null;
  self::Class::staticMethod();
  c1.{self::Class::externalInstanceGetter}{dynamic};
  c1.{self::Class::externalInstanceSetter} = null;
  c1.{self::Class::externalInstanceMethod}(){() →* dynamic};
  self::Class::externalStaticGetter;
  self::Class::externalStaticSetter = null;
  self::Class::externalStaticMethod();
  c1.{self::Class::nativeInstanceGetter}{dynamic};
  c1.{self::Class::nativeInstanceSetter} = null;
  c1.{self::Class::nativeInstanceMethod}(){() →* dynamic};
  self::Class::nativeStaticGetter;
  self::Class::nativeStaticSetter = null;
  self::Class::nativeStaticMethod();
  self::NativeClass* c2 = new self::NativeClass::generative();
  self::NativeClass::fact();
  new self::NativeClass::externalGenerative();
  self::NativeClass::externalFact();
  new self::NativeClass::nativeGenerative();
  self::NativeClass::nativeFact();
  c2.{self::NativeClass::instanceField}{dynamic};
  c2.{self::NativeClass::instanceGetter}{dynamic};
  c2.{self::NativeClass::instanceSetter} = null;
  c2.{self::NativeClass::instanceMethod}(){() →* dynamic};
  self::NativeClass::staticField;
  self::NativeClass::staticGetter;
  self::NativeClass::staticSetter = null;
  self::NativeClass::staticMethod();
  c2.{self::NativeClass::externalInstanceGetter}{dynamic};
  c2.{self::NativeClass::externalInstanceSetter} = null;
  c2.{self::NativeClass::externalInstanceMethod}(){() →* dynamic};
  self::NativeClass::externalStaticGetter;
  self::NativeClass::externalStaticSetter = null;
  self::NativeClass::externalStaticMethod();
  c2.{self::NativeClass::nativeInstanceGetter}{dynamic};
  c2.{self::NativeClass::nativeInstanceSetter} = null;
  c2.{self::NativeClass::nativeInstanceMethod}(){() →* dynamic};
  self::NativeClass::nativeStaticGetter;
  self::NativeClass::nativeStaticSetter = null;
  self::NativeClass::nativeStaticMethod();
}

constants  {
  #C1 = ""
  #C2 = _in::ExternalName {name:#C1}
  #C3 = "d"
  #C4 = _js::Native {name:#C3}
}


Constructor coverage from constants:
org-dartlang-testcase:///native.dart:
- ExternalName. (from org-dartlang-sdk:///lib/internal/internal.dart)
- Object. (from org-dartlang-sdk:///lib/core/object.dart)
- Native. (from org-dartlang-sdk:///lib/_internal/js_runtime/lib/annotations.dart)
