// @dart = 2.7
import 'dart:_js_helper';

class Class {
  Class.generative();
  Class.nativeGenerative() native;
  external Class.externalGenerative();
  external externalInstanceMethod();
  external factory Class.externalFact();
  external get externalInstanceGetter;
  external set externalInstanceSetter(_);
  external static externalStaticMethod();
  external static get externalStaticGetter;
  external static set externalStaticSetter(_);
  factory Class.fact() => null;
  factory Class.nativeFact() native;
  get instanceGetter => null;
  get nativeInstanceGetter native;
  instanceMethod() {}
  nativeInstanceMethod() native;
  set instanceSetter(_) {}
  set nativeInstanceSetter(_) native;
  static get nativeStaticGetter native;
  static get staticGetter => null;
  static nativeStaticMethod() native;
  static set nativeStaticSetter(_) native;
  static set staticSetter(_) {}
  static staticMethod() {}
  static var staticField;
  var instanceField;
}

@Native('d')
class NativeClass {
  NativeClass.generative();
  NativeClass.nativeGenerative() native;
  external NativeClass.externalGenerative();
  external externalInstanceMethod();
  external factory NativeClass.externalFact();
  external get externalInstanceGetter;
  external set externalInstanceSetter(_);
  external static externalStaticMethod();
  external static get externalStaticGetter;
  external static set externalStaticSetter(_);
  factory NativeClass.fact() => null;
  factory NativeClass.nativeFact() native;
  get instanceGetter => null;
  get nativeInstanceGetter native;
  instanceMethod() {}
  nativeInstanceMethod() native;
  set instanceSetter(_) {}
  set nativeInstanceSetter(_) native;
  static get nativeStaticGetter native;
  static get staticGetter => null;
  static nativeStaticMethod() native;
  static set nativeStaticSetter(_) native;
  static set staticSetter(_) {}
  static staticMethod() {}
  static var staticField;
  var instanceField;
  var instanceNamedField;
}

external externalTopLevelFunction();
external get externalTopLevelGetter;
external set externalTopLevelSetter(_);
get nativeTopLevelGetter native;
get topLevelGetter => null;
main() {}
nativeTopLevelFunction() native;
set nativeTopLevelSetter(_) native;
set topLevelSetter(_) {}
topLevelFunction() {}
var topLevelField;
