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

class Bar {
  Bar(val);
}

class Foo {
//    ^
// [cfe] The non-abstract class 'Foo' is missing implementations for these members:
  var x;
  f() {}

  Foo() : x = 0;

  // fields can't be declared external
  external var x01;
//^^^^^^^^
// [analyzer] SYNTACTIC_ERROR.EXTERNAL_FIELD
// [cfe] Fields can't be declared to be 'external'.
  external int x02;
//^^^^^^^^
// [analyzer] SYNTACTIC_ERROR.EXTERNAL_FIELD
// [cfe] Fields can't be declared to be 'external'.

  external f11() { }
  //             ^
  // [analyzer] SYNTACTIC_ERROR.EXTERNAL_METHOD_WITH_BODY
  // [cfe] An external or native method can't have a body.
  external f12() => 1;
  //             ^^
  // [analyzer] SYNTACTIC_ERROR.EXTERNAL_METHOD_WITH_BODY
  // [cfe] An external or native method can't have a body.
  //                ^
  // [cfe] An external or native method can't have a body.
  static external f14();
  //     ^^^^^^^^
  // [analyzer] SYNTACTIC_ERROR.MODIFIER_OUT_OF_ORDER
  // [cfe] The modifier 'external' should be before the modifier 'static'.
  int external f16();
  //  ^^^^^^^^
  // [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
  // [cfe] Expected ';' after this.
  //           ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER

  external Foo.n21(val) : x = 1;
  //                    ^
  // [analyzer] SYNTACTIC_ERROR.EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER
  // [cfe] An external constructor can't have any initializers.
  external Foo.n22(val) { x = 1; }
  //                    ^
  // [analyzer] SYNTACTIC_ERROR.EXTERNAL_METHOD_WITH_BODY
  // [cfe] An external or native method can't have a body.
  external factory Foo.n23(val) => new Foo();
  //                            ^^
  // [analyzer] SYNTACTIC_ERROR.EXTERNAL_FACTORY_WITH_BODY
  // [cfe] External factories can't have a body.
  //                               ^
  // [cfe] An external or native method can't have a body.
  external Foo.n24(this.x);
  //                    ^
  // [cfe] An external constructor can't initialize fields.
  external factory Foo.n25(val) = Bar;
  //                            ^
  // [analyzer] SYNTACTIC_ERROR.EXTERNAL_FACTORY_REDIRECTION
  // [cfe] A redirecting factory can't be external.
  //                              ^^^
  // [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_INVALID_RETURN_TYPE
  // [cfe] The constructor function type 'Bar Function(dynamic)' isn't a subtype of 'Foo Function(dynamic)'.
}

external int t06(int i) { }
// [error line 76, column 1, length 8]
// [analyzer] SYNTACTIC_ERROR.EXTERNAL_METHOD_WITH_BODY
// [cfe] An external or native method can't have a body.
//                      ^
// [cfe] An external or native method can't have a body.
external int t07(int i) => i + 1;
// [error line 82, column 1, length 8]
// [analyzer] SYNTACTIC_ERROR.EXTERNAL_METHOD_WITH_BODY
// [cfe] An external or native method can't have a body.
//                         ^
// [cfe] An external or native method can't have a body.

main() {
  // Ensure Foo class is compiled.
  var foo = new Foo();

  new Foo().f11();
  new Foo().f12();
  Foo.f14();
  new Foo().f16();

  new Foo.n21(1);
  new Foo.n22(1);
  new Foo.n23(1);
  new Foo.n24(1);
  new Foo.n25(1);

  t06(1);
  t07(1);
}
