// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Test for positive and negative uses of named declarations. This file is
// also used in tests/compiler/dart2js/model/native_test.dart.

import 'dart:_js_helper';

var topLevelField;

get topLevelGetter => null;

set topLevelSetter(_) {}

topLevelFunction() {}

// NON_NATIVE_EXTERNAL               //# 01: compile-time error
external get externalTopLevelGetter; //# 01: continued

// NON_NATIVE_EXTERNAL                  //# 02: compile-time error
external set externalTopLevelSetter(_); //# 02: continued

// NON_NATIVE_EXTERNAL               //# 03: compile-time error
external externalTopLevelFunction(); //# 03: continued

get nativeTopLevelGetter native;

set nativeTopLevelSetter(_) native;

nativeTopLevelFunction() native;

class Class {
  Class.generative();
  factory Class.fact() => null as dynamic;

  // NON_NATIVE_EXTERNAL               //# 08: compile-time error
  external Class.externalGenerative(); //# 08: continued

  // NON_NATIVE_EXTERNAL                 //# 09: compile-time error
  external factory Class.externalFact(); //# 09: continued

  // NATIVE_NON_INSTANCE_IN_NON_NATIVE_CLASS //# 10: compile-time error
  Class.nativeGenerative() native; //# 10: continued

  // NATIVE_NON_INSTANCE_IN_NON_NATIVE_CLASS //# 11: compile-time error
  factory Class.nativeFact() native; //# 11: continued

  var instanceField;
  get instanceGetter => null;
  set instanceSetter(_) {}
  instanceMethod() {}

  static var staticField;
  static get staticGetter => null;
  static set staticSetter(_) {}
  static staticMethod() {}

  // NON_NATIVE_EXTERNAL               //# 22: compile-time error
  external get externalInstanceGetter; //# 22: continued

  // NON_NATIVE_EXTERNAL                  //# 23: compile-time error
  external set externalInstanceSetter(_); //# 23: continued

  // NON_NATIVE_EXTERNAL             //# 24: compile-time error
  external externalInstanceMethod(); //# 24: continued

  // NON_NATIVE_EXTERNAL                    //# 25: compile-time error
  external static get externalStaticGetter; //# 25: continued

  // NON_NATIVE_EXTERNAL                       //# 26: compile-time error
  external static set externalStaticSetter(_); //# 26: continued

  // NON_NATIVE_EXTERNAL                  //# 27: compile-time error
  external static externalStaticMethod(); //# 27: continued

  get nativeInstanceGetter native;
  set nativeInstanceSetter(_) native;
  nativeInstanceMethod() native;

  // NATIVE_NON_INSTANCE_IN_NON_NATIVE_CLASS //# 28: compile-time error
  static get nativeStaticGetter native; //# 28: continued

  // NATIVE_NON_INSTANCE_IN_NON_NATIVE_CLASS //# 29: compile-time error
  static set nativeStaticSetter(_) native; //# 29: continued

  // NATIVE_NON_INSTANCE_IN_NON_NATIVE_CLASS //# 30: compile-time error
  static nativeStaticMethod() native; //# 30: continued
}

@Native('d')
class NativeClass {
  NativeClass.generative();

  factory NativeClass.fact() => null as dynamic;

  // NON_NATIVE_EXTERNAL                     //# 31: compile-time error
  external NativeClass.externalGenerative(); //# 31: continued
  // NON_NATIVE_EXTERNAL                       //# 32: compile-time error
  external factory NativeClass.externalFact(); //# 32: continued

  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;

  // NON_NATIVE_EXTERNAL               //# 36: compile-time error
  external get externalInstanceGetter; //# 36: continued

  // NON_NATIVE_EXTERNAL                  //# 37: compile-time error
  external set externalInstanceSetter(_); //# 37: continued

  // NON_NATIVE_EXTERNAL             //# 38: compile-time error
  external externalInstanceMethod(); //# 38: continued

  // NON_NATIVE_EXTERNAL                    //# 39: compile-time error
  external static get externalStaticGetter; //# 39: continued

  // NON_NATIVE_EXTERNAL                       //# 40: compile-time error
  external static set externalStaticSetter(_); //# 40: continued

  // NON_NATIVE_EXTERNAL                  //# 41: compile-time error
  external static externalStaticMethod(); //# 41: continued

  get nativeInstanceGetter native;
  set nativeInstanceSetter(_) native;
  nativeInstanceMethod() native;

  static get nativeStaticGetter native;
  static set nativeStaticSetter(_) native;
  static nativeStaticMethod() native;
}

main() {
  if (true) return;

  topLevelField;
  topLevelGetter;
  topLevelSetter = null;
  topLevelFunction();
  externalTopLevelGetter; //# 01: continued
  externalTopLevelSetter = null; //# 02: continued
  externalTopLevelFunction(); //# 03: continued
  nativeTopLevelGetter;
  nativeTopLevelSetter = null;
  nativeTopLevelFunction();

  var c1 = new Class.generative();
  new Class.fact();
  new Class.externalGenerative(); //# 08: continued
  new Class.externalFact(); //# 09: continued
  new Class.nativeGenerative(); //# 10: continued
  new Class.nativeFact(); //# 11: continued
  c1.instanceField;
  c1.instanceGetter;
  c1.instanceSetter = null;
  c1.instanceMethod();
  Class.staticField;
  Class.staticGetter;
  Class.staticSetter = null;
  Class.staticMethod();
  c1.externalInstanceGetter; //# 22: continued
  c1.externalInstanceSetter = null; //# 23: continued
  c1.externalInstanceMethod(); //# 24: continued
  Class.externalStaticGetter; //# 25: continued
  Class.externalStaticSetter = null; //# 26: continued
  Class.externalStaticMethod(); //# 27: continued
  c1.nativeInstanceGetter;
  c1.nativeInstanceSetter = null;
  c1.nativeInstanceMethod();
  Class.nativeStaticGetter; //# 28: continued
  Class.nativeStaticSetter = null; //# 29: continued
  Class.nativeStaticMethod(); //# 30: continued

  var c2 = new NativeClass.generative();
  new NativeClass.fact();
  new NativeClass.externalGenerative(); //# 31: continued
  new NativeClass.externalFact(); //# 32: continued
  new NativeClass.nativeGenerative();
  new NativeClass.nativeFact();
  c2.instanceField;
  c2.instanceGetter;
  c2.instanceSetter = null;
  c2.instanceMethod();
  NativeClass.staticField;
  NativeClass.staticGetter;
  NativeClass.staticSetter = null;
  NativeClass.staticMethod();
  c2.externalInstanceGetter; //# 36: continued
  c2.externalInstanceSetter = null; //# 37: continued
  c2.externalInstanceMethod(); //# 38: continued
  NativeClass.externalStaticGetter; //# 39: continued
  NativeClass.externalStaticSetter = null; //# 40: continued
  NativeClass.externalStaticMethod(); //# 41: continued
  c2.nativeInstanceGetter;
  c2.nativeInstanceSetter = null;
  c2.nativeInstanceMethod();
  NativeClass.nativeStaticGetter;
  NativeClass.nativeStaticSetter = null;
  NativeClass.nativeStaticMethod();
}
