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

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 74, 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 80, 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);
}
