// 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 SyntaxTest {
  // "this" cannot be used as a field name.
  SyntaxTest this; //# 01: compile-time error

  // Syntax error.
  foo {} //# 02: compile-time error

  // Syntax error.
  static foo {} //# 03: compile-time error

  // Syntax error.
  operator +=() {} //# 04: compile-time error

  // Syntax error.
  operator -=() {} //# 05: compile-time error

  // Syntax error.
  operator *=() {} //# 06: compile-time error

  // Syntax error.
  operator /=() {} //# 07: compile-time error

  // Syntax error.
  operator ~/=() {} //# 08: compile-time error

  // Syntax error.
  operator %=() {} //# 09: compile-time error

  // Syntax error.
  operator <<=() {} //# 10: compile-time error

  // Syntax error.
  operator >>=() {} //# 11: compile-time error

  // Syntax error.
  operator >>>=() {} //# 12: compile-time error

  // Syntax error.
  operator &=() {} //# 13: compile-time error

  // Syntax error.
  operator ^=() {} //# 14: compile-time error

  // Syntax error.
  operator |=() {} //# 15: compile-time error

  // Syntax error.
  operator ?() {} //# 16: compile-time error

  // Syntax error.
  operator ||() {} //# 17: compile-time error

  // Syntax error.
  operator &&() {} //# 18: compile-time error

  // Syntax error.
  operator !=() {} //# 19: compile-time error

  // Syntax error.
  operator ===() {} //# 20: compile-time error

  // Syntax error.
  operator !==() {} //# 21: compile-time error

  // Syntax error.
  operator is() {} //# 22: compile-time error

  // Syntax error.
  operator !() {} //# 23: compile-time error

  // Syntax error.
  operator ++() {} //# 24: compile-time error

  // Syntax error.
  operator --() {} //# 25: compile-time error

  // Syntax error.
  bool operator ===(A other) { return true; } //# 26: compile-time error

  int sample;
}

fisk {} //# 27: compile-time error

class DOMWindow {}

class Window extends DOMWindow
native "*Window" //# 28: compile-time error
{}

class Console
native "=(typeof console == 'undefined' ? {} : console)" //# 29: compile-time error
{}

class NativeClass
native "FooBar" //# 30: compile-time error
{}

abstract class Fisk {}

class BoolImplementation implements Fisk
native "Boolean" //# 31: compile-time error
{}

class _JSON
native 'JSON' //# 32: compile-time error
{}

class ListFactory<E> implements List<E>
native "Array" //# 33: compile-time error
{}

abstract class I implements UNKNOWN; //# 34: compile-time error

class XWindow extends DOMWindow
hest "*Window" //# 35: compile-time error
{}

class XConsole
hest "=(typeof console == 'undefined' ? {} : console)" //# 36: compile-time error
{}

class XNativeClass
hest "FooBar" //# 37: compile-time error
{}

class XBoolImplementation implements Fisk
hest "Boolean" //# 38: compile-time error
{}

class _JSONX
hest 'JSON' //# 39: compile-time error
{}

class XListFactory<E> implements List<E>
hest "Array" //# 40: compile-time error
{}

class YWindow extends DOMWindow
for "*Window" //# 41: compile-time error
{}

class YConsole
for "=(typeof console == 'undefined' ? {} : console)" //# 42: compile-time error
{}

class YNativeClass
for "FooBar" //# 43: compile-time error
{}

class YBoolImplementation implements Fisk
for "Boolean" //# 44: compile-time error
{}

class _JSONY
for 'JSON' //# 45: compile-time error
{}

class YListFactory<E> implements List<E>
for "Array" //# 46: compile-time error
{}

class A {
  const A()
  {} //# 47: compile-time error
  ;
}

abstract class G<T> {}

typedef <T>(); //# 48: compile-time error

class B
extends void //# 49: compile-time error
{}

main() {
  try {
    new SyntaxTest();
    new SyntaxTest().foo(); //# 02: continued
    SyntaxTest.foo(); //# 03: continued
    fisk(); //# 27: continued

    new Window();
    new Console();
    new NativeClass();
    new BoolImplementation();
    new _JSON();
    new ListFactory();
    new ListFactory<Object>();
    var x = null;
    x is I; //# 34: continued

    new XConsole();
    new XNativeClass();
    new XBoolImplementation();
    new _JSONX();
    new XListFactory();
    new XListFactory<Object>();

    new YConsole();
    new YNativeClass();
    new YBoolImplementation();
    new _JSONY();
    new YListFactory();
    new YListFactory<Object>();

    futureOf(x) {}
    if (!(fisk futureOf(false))) {} //# 50: compile-time error
    if (!(await futureOf(false))) {} //# 51: compile-time error

    void f{} //# 52: compile-time error
    G<int double> g; //# 53: compile-time error
    f(void) {}; //# 54: compile-time error

    optionalArg([x]) {}
    optionalArg(
      void (var i) {} //# 55: compile-time error
        );

    function __PROTO__$(...args) { return 12; } //# 56: compile-time error
    G<> t; //# 57: compile-time error
    G<null> t; //# 58: compile-time error
    A<void> a = null; //# 59: compile-time error
    void v; //# 60: compile-time error
    void v = null; //# 61: compile-time error
    print(null is void); //# 62: compile-time error
    new A();
    new B();

    new Bad();

    1 + 2 = 1; //# 63: compile-time error
    new SyntaxTest() = 1; //# 64: compile-time error
    futureOf(null) = 1; //# 65: compile-time error

  } catch (ex) {
    // Swallowing exceptions. Any error should be a compile-time error
    // which kills the current isolate.
  }
}

class Bad {
  factory Bad<Bad(String type) { return null; } //# 63: compile-time error
}
