// Copyright (c) 2021, 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.

// Checks for static errors using external without the @JS() annotation,
// in a library with a @JS() annotation

@JS()
library external_static_test;

import 'dart:html';
import 'package:js/js.dart';

// external top level members ok in @JS() library.
external var topLevelField;
external final topLevelFinalField;
external get topLevelGetter;
external set topLevelSetter(_);
external topLevelFunction();

class Constructors {
  external Constructors();
  //       ^
  // [web] Only JS interop members may be 'external'.

  external Constructors.namedConstructor();
  //       ^
  // [web] Only JS interop members may be 'external'.

  external factory Constructors.namedFactory();
  //               ^
  // [web] Only JS interop members may be 'external'.
}

class Members {
  external var field;
  //           ^
  // [web] Only JS interop members may be 'external'.

  external final finalField;
  //             ^
  // [web] Only JS interop members may be 'external'.

  external get instanceGetter;
  //           ^
  // [web] Only JS interop members may be 'external'.

  external set instanceSetter(_);
  //           ^
  // [web] Only JS interop members may be 'external'.

  external instanceMethod();
  //       ^
  // [web] Only JS interop members may be 'external'.
}

class StaticMembers {
  external static var staticField;
  //                  ^
  // [web] Only JS interop members may be 'external'.

  external static final staticFinalField;
  //                    ^
  // [web] Only JS interop members may be 'external'.

  external static get staticGetter;
  //                  ^
  // [web] Only JS interop members may be 'external'.

  external static set staticSetter(_);
  //                  ^
  // [web] Only JS interop members may be 'external'.

  external static staticMethod();
  //              ^
  // [web] Only JS interop members may be 'external'.
}

@anonymous
class AnonymousClass {
  external var field;
  //           ^
  // [web] Only JS interop members may be 'external'.

  external factory AnonymousClass({var field});
  //               ^
  // [web] Only JS interop members may be 'external'.
}

extension ExtensionNonJS on NonJSClass {
  external var field;
  //           ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
  external final finalField;
  //             ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
  external static var staticField;
  //                  ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
  external static final staticFinalField;
  //                    ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.

  external get getter;
  //           ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
  external set setter(_);
  //           ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.

  external static get staticGetter;
  //                  ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
  external static set staticSetter(_);
  //                  ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.

  external method();
  //       ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
  external static staticMethod();
  //              ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
  external optionalParameterMethod([int? a, int b = 0]);
  //       ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
  external overriddenMethod();
  //       ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.

  @JS('fieldAnnotation')
  external var annotatedField;
  //           ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
  @JS('memberAnnotation')
  external annotatedMethod();
  //       ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.

  nonExternalMethod() => 1;
  static nonExternalStaticMethod() => 2;
}

class NonJSClass {
  void overriddenMethod() => 5;
}

extension ExtensionGenericNonJS<T> on GenericNonJSClass<T> {
  external T method();
  //         ^
  // [web] JS interop type or @Native type from an SDK web library required for 'external' extension members.
}

class GenericNonJSClass<T> {}

extension ExtensionJS on JSClass {
  external var field;
  external final finalField;

  external get getter;
  external set setter(_);

  external method();
  external optionalParameterMethod([int? a, int b = 0]);
  //                                            ^
  // [web] Initializers for parameters are ignored on static interop external functions.

  @JS('fieldAnnotation')
  external var annotatedField;

  @JS('memberAnnotation')
  external annotatedMethod();

  nonExternalMethod() => 1;
  static nonExternalStaticMethod() => 2;
}

@JS()
class JSClass {}

extension ExtensionGenericJS<T> on GenericJSClass<T> {
  external T method();
}

@JS()
class GenericJSClass<T> {}

extension ExtensionAnonymousJS on AnonymousJSClass {
  external var field;
  external get getter;
  external set setter(_);
  external method();
}

@JS()
@anonymous
class AnonymousJSClass {}

extension ExtensionAbstractJS on AbstractJSClass {
  external var field;
  external get getter;
  external set setter(_);
  external method();
}

@JS()
abstract class AbstractJSClass {}

extension ExtensionAnnotatedJS on AnnotatedJSClass {
  external var field;
  external get getter;
  external set setter(_);
  external method();
}

@JS('Annotation')
class AnnotatedJSClass {}

extension ExtensionPrivateJS on _privateJSClass {
  external var field;
  external get getter;
  external set setter(_);
  external method();
}

@JS()
class _privateJSClass {}

extension ExtensionNative on HtmlElement {
  external var field;
  external final finalField;

  external get getter;
  external set setter(_);

  external method();
  external optionalParameterMethod([int? a, int b = 0]);
  //                                            ^
  // [web] Initializers for parameters are ignored on static interop external functions.

  nonExternalMethod() => 1;
  static nonExternalStaticMethod() => 2;
}

main() {}
