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

import "package:expect/expect.dart";

main() {
  const f0 = 42;
  const f1;
  //    ^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_NOT_INITIALIZED
  //      ^
  // [cfe] The const variable ';' must be initialized.
  const int f2 = 87;
  const int f3;
  //        ^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_NOT_INITIALIZED
  //          ^
  // [cfe] The const variable ';' must be initialized.
  Expect.equals(42, f0);
  Expect.equals(87, f2);

  Expect.equals(42, F0);
  Expect.equals(null, F1);
  Expect.equals(87, F2);
  Expect.equals(null, F3);

  Expect.isTrue(P0 is Point);
  Expect.isTrue(P1 is int);
  Expect.isTrue(P2 is Point);
  Expect.isTrue(P3 is int);

  Expect.isTrue(A0 is int);
  Expect.isTrue(A1 is int);
  Expect.isTrue(A2 is int);
  Expect.isTrue(A3 is int);

  Expect.isTrue(C0.X is C1);
  Expect.isTrue(C0.X.x is C1);

  Expect.equals("Hello 42", B2);
  Expect.equals("42Hello", B3);

  const cf1 = identical(const Point(1, 2), const Point(1, 2));

  const cf2 = identical(const Point(1, 2), new Point(1, 2));
  //                                       ^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  // [cfe] New expression is not a constant expression.

  var f4 = B4;
  var f5 = B5;
}

const F0 = 42;
const F1;
//    ^^
// [analyzer] COMPILE_TIME_ERROR.CONST_NOT_INITIALIZED
// [cfe] The const variable 'F1' must be initialized.
const int F2 = 87;
const int F3;
//        ^^
// [analyzer] COMPILE_TIME_ERROR.CONST_NOT_INITIALIZED
// [cfe] The const variable 'F3' must be initialized.

class Point {
  final x, y;
  const Point(this.x, this.y);
  operator +(int other) => x;
}

// Check that compile time expressions can include invocations of
// user-defined const constructors.
const P0 = const Point(0, 0);
const P1 = const Point(0, 0) + 1;
//         ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_NUM
//                           ^
// [cfe] Constant evaluation error:
const P2 = new Point(0, 0);
//         ^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
// [cfe] New expression is not a constant expression.
const P3 = new Point(0, 0) + 1;
//         ^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
// [cfe] New expression is not a constant expression.

// Check that we cannot have cyclic references in compile time
// expressions.
const A0 = 42;
const A1 = A0 + 1;
const A2 = A3 + 1;
//    ^^
// [analyzer] COMPILE_TIME_ERROR.RECURSIVE_COMPILE_TIME_CONSTANT
// [cfe] Can't infer the type of 'A2': circularity found during type inference.
//         ^^
// [analyzer] COMPILE_TIME_ERROR.TOP_LEVEL_CYCLE
//            ^
// [cfe] Constant evaluation error:
const A3 = A2 + 1;
//    ^^
// [analyzer] COMPILE_TIME_ERROR.RECURSIVE_COMPILE_TIME_CONSTANT
//         ^^
// [analyzer] COMPILE_TIME_ERROR.TOP_LEVEL_CYCLE

class C0 {
  static const X = const C1();
  //           ^
  // [analyzer] COMPILE_TIME_ERROR.RECURSIVE_COMPILE_TIME_CONSTANT
}

class C1 {
  const C1()
      : x = C0.X
      //^
      // [analyzer] STATIC_WARNING.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION
      //  ^
      // [cfe] 'x' is a final instance variable that has already been initialized.
      //  ^
      // [cfe] Cannot invoke a non-'const' constructor where a const expression is expected.
  ;
  final x = null;
}

// Check that sub-expressions of binary + are numeric.
const B0 = 42;
const B1 = "Hello";
const B2 = "$B1 $B0";
const B3 = B0 + B1;
//         ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_NUM
//              ^^
// [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] A value of type 'String' can't be assigned to a variable of type 'num'.

// Check identical.

const B4 = identical(1, new Point(1, 2));
//                      ^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
// [cfe] New expression is not a constant expression.
const B5 = identical(1, const Point(1, 2));
