import 'dart:_js_helper';

var topLevelField;

get topLevelGetter => null;

set topLevelSetter(_) {}

topLevelFunction() {}

external get externalTopLevelGetter;

external set externalTopLevelSetter(_);

external externalTopLevelFunction();

get nativeTopLevelGetter native;

set nativeTopLevelSetter(_) native;

nativeTopLevelFunction() native;

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

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

main() {}
