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

// Tests local function usage, some having references to other constant values.

// SharedOptions=--enable-experiment=const-functions

import "package:expect/expect.dart";

int function1() {
  int add(int a, int b) => a + b;
  const value = add(10, 2);
  //            ^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  return value;
}

const constTwo = 2;
int function2() {
  int addTwo(int a) {
    int b = a + constTwo;
    return b;
  }

  const value = addTwo(2);
  //            ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  return value;
}

int function3() {
  int addTwoReturn(int a) => a + constTwo;
  const value = addTwoReturn(3);
  //            ^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  return value;
}

int function4() {
  const localTwo = 2;
  int addTwo(int a) => a + localTwo;
  const value = addTwo(20);
  //            ^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  return value;
}

int function5() {
  T typeFn<T>(T a) => a;
  const value = typeFn(3);
  //            ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  return value;
}

int function6() {
  int optionalFn([int a = 0]) => a;
  const value = optionalFn(1);
  //            ^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  return value;
}

int function7() {
  int namedFn({int a = 0}) => a;
  const value = namedFn(a: 2);
  //            ^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  return value;
}

int function8() {
  int add(int a, int b) => a + b;
  const value = add(1, 1);
  //            ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  const value1 = add(2, 3);
  //             ^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
  return value + value1;
}

void main() {
  Expect.equals(function1(), 12);
  Expect.equals(function2(), 4);
  Expect.equals(function3(), 5);
  Expect.equals(function4(), 22);
  Expect.equals(function5(), 3);
  Expect.equals(function6(), 1);
  Expect.equals(function7(), 2);
  Expect.equals(function8(), 7);
}
