// 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, GENERIC  //# 10: compile-time error
  Class.jsInteropGenerative(); //# 10: continued

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

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

  @JS('a') // GENERIC  //# 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') // GENERIC  //# 14: compile-time error
  var instanceJsInteropField; //# 14: continued

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

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

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

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

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

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

  @JS('a') // GENERIC  //# 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') // GENERIC  //# 28: compile-time error
  external get externalInstanceJsInteropGetter; //# 28: continued

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

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

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

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

  @JS('a') // GENERIC  //# 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();
  }
}
