// 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 as dynamic;

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

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

  @JS('a') // 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

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

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

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

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

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

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

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

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

  // GENERIC //# 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') // GENERIC //# 46: compile-time error
  var instanceJsInteropField; //# 46: continued

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

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

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