// 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 Foo {
  var x;
  f() {}

  external var x01;  /// 01: compile-time error
  external int x02;  /// 02: compile-time error

  external f10();   /// 10: runtime error
  external f11() { }  /// 11: compile-time error
  external f12() => 1;  /// 12: compile-time error
  external static f13();  /// 13: runtime error
  static external f14();  /// 14: compile-time error
  int external f16();  /// 16: compile-time error

  external Foo.n20();  /// 20: runtime error
  external Foo.n21() : x(1);  /// 21: compile-time error
  external Foo.n22() { x = 1; }  /// 22: compile-time error
  external factory Foo.n23() => new Foo();  /// 23: compile-time error
}

external int t06(int i) { }  /// 30: compile-time error
external int t07(int i) => i + 1;  /// 31: compile-time error

main() {

  // Try calling an unpatched external function.
  var foo = new Foo();
  try {                                               /// 10: continued
    foo.f05();                                        /// 10: continued
  } on String catch (exc) {                           /// 10: continued
    if (exc == "External implementation missing.") {  /// 10: continued
      throw exc;                                      /// 10: continued
    }                                                 /// 10: continued
  }                                                   /// 10: continued

  try {                                               /// 13: continued
    Foo.f13();                                        /// 13: continued
  } on String catch (exc) {                           /// 13: continued
    if (exc == "External implementation missing.") {  /// 13: continued
      throw exc;                                      /// 13: continued
    }                                                 /// 13: continued
  }                                                   /// 13: continued

  // Try calling an unpatched external constructor.
  try {                                               /// 20: continued
    var foo = new Foo.n09();                          /// 20: continued
  } on String catch (exc) {                           /// 20: continued
    if (exc == "External implementation missing.") {  /// 20: continued
      throw exc;                                      /// 20: continued
    }                                                 /// 20: continued
  }                                                   /// 20: continued
}
