// 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.

// @dart = 2.7

// TODO(johnniwinther): Share this test with ddc.

// Test for positive and negative uses of js-interop declarations in a library
// _with_ a @JS() annotation. This file is also used in
// tests/compiler/dart2js/model/native_test.dart.

@JS()
library lib;

import 'package:js/js.dart';

var topLevelField;

get topLevelGetter => null;

set topLevelSetter(_) {}

topLevelFunction() {}

@JS('a') // JS_INTEROP_FIELD_NOT_SUPPORTED       //# 01: compile-time error
var topLevelJsInteropField; //# 01: continued

@JS('a') // JS_INTEROP_NON_EXTERNAL_MEMBER       //# 02: compile-time error
get topLevelJsInteropGetter => null; //# 02: continued

@JS('a') // JS_INTEROP_NON_EXTERNAL_MEMBER       //# 03: compile-time error
set topLevelJsInteropSetter(_) {} //# 03: continued

@JS('a') // JS_INTEROP_NON_EXTERNAL_MEMBER       //# 04: compile-time error
topLevelJsInteropFunction() {} //# 04: continued

external get externalTopLevelGetter;

external set externalTopLevelSetter(_);

external externalTopLevelFunction();

@JS('a')
external get externalTopLevelJsInteropGetter;

@JS('b')
external set externalTopLevelJsInteropSetter(_);

@JS('c')
external externalTopLevelJsInteropFunction();

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

  // 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

  @JS('a') // GENERIC  //# 10: compile-time error
  Class.jsInteropGenerative(); //# 10: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 11: compile-time error
  factory Class.jsInteropFact() => null; //# 11: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 12: compile-time error
  external Class.externalJsInteropGenerative(); //# 12: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 13: compile-time error
  external factory Class.externalJsInteropFact(); //# 13: continued

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

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

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 14: compile-time error
  var instanceJsInteropField; //# 14: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 15: compile-time error
  get instanceJsInteropGetter => null; //# 15: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 16: compile-time error
  set instanceJsInteropSetter(_) {} //# 16: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 17: compile-time error
  instanceJsInteropMethod() {} //# 17: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 18: compile-time error
  static var staticJsInteropField; //# 18: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 19: compile-time error
  static get staticJsInteropGetter => null; //# 19: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 20: compile-time error
  static set staticJsInteropSetter(_) {} //# 20: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 21: compile-time error
  static staticJsInteropMethod() {} //# 21: continued

  // 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

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 28: compile-time error
  external get externalInstanceJsInteropGetter; //# 28: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 29: compile-time error
  external set externalInstanceJsInteropSetter(_); //# 29: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 30: compile-time error
  external externalInstanceJsInteropMethod(); //# 30: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 31: compile-time error
  external static get externalStaticJsInteropGetter; //# 31: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 32: compile-time error
  external static set externalStaticJsInteropSetter(_); //# 32: continued

  @JS('a') // JS_INTEROP_MEMBER_IN_NON_JS_INTEROP_CLASS  //# 33: compile-time error
  external static externalStaticJsInteropMethod(); //# 33: continued
}

@JS('d')
class JsInteropClass {
  // GENERIC //# 34: compile-time error
  JsInteropClass.generative(); //# 34: continued

  // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 35: compile-time error
  factory JsInteropClass.fact() => null; //# 35: continued

  external JsInteropClass.externalGenerative();
  external factory JsInteropClass.externalFact();

  @JS('a') // GENERIC //# 36: compile-time error
  JsInteropClass.jsInteropGenerative(); //# 36: continued

  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_CONSTRUCTOR //# 37: compile-time error
  factory JsInteropClass.jsInteropFact() => null; //# 37: continued

  @JS('a')
  external JsInteropClass.externalJsInteropGenerative();

  @JS('a')
  external factory JsInteropClass.externalJsInteropFact();

  // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 38: compile-time error
  var instanceField; //# 38: continued

  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 39: compile-time error
  get instanceGetter => null; //# 39: continued

  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 40: compile-time error
  set instanceSetter(_) {} //# 40: continued

  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 41: compile-time error
  instanceMethod() {} //# 41: continued

  // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 42: compile-time error
  static var staticField; //# 42: continued

  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 43: compile-time error
  static get staticGetter => null; //# 43: continued

  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 44: compile-time error
  static set staticSetter(_) {} //# 44: continued

  // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 45: compile-time error
  static staticMethod() {} //# 45: continued

  @JS('a') // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 46: compile-time error
  var instanceJsInteropField; //# 46: continued

  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 48: compile-time error
  get instanceJsInteropGetter => null; //# 48: continued

  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 49: compile-time error
  set instanceJsInteropSetter(_) {} //# 49: continued

  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 50: compile-time error
  instanceJsInteropMethod() {} //# 50: continued

  @JS('a') // IMPLICIT_JS_INTEROP_FIELD_NOT_SUPPORTED //# 51: compile-time error
  static var staticJsInteropField; //# 51: continued

  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 52: compile-time error
  static get staticJsInteropGetter => null; //# 52: continued

  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 53: compile-time error
  static set staticJsInteropSetter(_) {} //# 53: continued

  @JS('a') // JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER //# 54: compile-time error
  static staticJsInteropMethod() {} //# 54: continued

  external get externalInstanceGetter;
  external set externalInstanceSetter(_);
  external externalInstanceMethod();

  external static get externalStaticGetter;
  external static set externalStaticSetter(_);
  external static externalStaticMethod();

  @JS('a')
  external get externalInstanceJsInteropGetter;

  @JS('a')
  external set externalInstanceJsInteropSetter(_);

  @JS('a')
  external externalInstanceJsInteropMethod();

  @JS('a')
  external static get externalStaticJsInteropGetter;

  @JS('a')
  external static set externalStaticJsInteropSetter(_);

  @JS('a')
  external static externalStaticJsInteropMethod();
}

main() {
  if (false) {
    topLevelSetter = topLevelField = topLevelGetter;
    topLevelFunction();
    externalTopLevelSetter = externalTopLevelGetter;
    externalTopLevelFunction();
    externalTopLevelJsInteropSetter = externalTopLevelJsInteropGetter;
    externalTopLevelJsInteropFunction();
    Class c1 = new Class.generative();
    new Class.fact();
    c1.instanceSetter = c1.instanceField = c1.instanceGetter;
    c1.instanceMethod();
    Class.staticSetter = Class.staticField = Class.staticGetter;
    Class.staticMethod();
    JsInteropClass c2 = new JsInteropClass.externalGenerative();
    new JsInteropClass.externalFact();
    new JsInteropClass.externalJsInteropGenerative();
    new JsInteropClass.externalJsInteropFact();
    c2.externalInstanceSetter = c2.externalInstanceGetter;
    c2.externalInstanceMethod();
    c2.externalInstanceJsInteropSetter = c2.externalInstanceJsInteropGetter;
    c2.externalInstanceJsInteropMethod();
    JsInteropClass.externalStaticSetter = JsInteropClass.externalStaticGetter;
    JsInteropClass.externalStaticMethod();
    JsInteropClass.externalStaticJsInteropSetter =
        JsInteropClass.externalStaticJsInteropGetter;
    JsInteropClass.externalStaticJsInteropMethod();
  }
}
