// 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 try-catch and try-finally with const functions.

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

import "package:expect/expect.dart";

const var1 = fn("s");
//           ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var2 = fn(1);
//           ^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int fn(dynamic error) {
  try {
    throw error;
  } on String {
    return 0;
  } catch (e) {
    return 1;
  }
}

const var3 = fn1(10);
//           ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var4 = fn1("s");
//           ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int fn1(dynamic error) {
  try {
    throw error;
  } on int catch (e) {
    return e;
  } catch (e) {
    return 1;
  }
}

const var5 = finallyReturn(10);
//           ^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var6 = finallyReturn("s");
//           ^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var7 = finallyReturn(1);
//           ^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int finallyReturn(dynamic error) {
  try {
    if (error != 1) throw error;
  } on int catch (e) {
    return e;
  } catch (e) {
    return 1;
  } finally {
    return 100;
  }
}

const var8 = finallyReturn1(0);
//           ^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var9 = finallyReturn1(1);
//           ^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int finallyReturn1(int x) {
  try {
    if (x == 1) {
      throw x;
    } else {
      return 0;
    }
  } finally {
    return 100;
  }
}

const var10 = finallyMutate();
//            ^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int finallyMutate() {
  int x = 0;
  try {
    return x;
  } finally {
    x++;
  }
}

const var11 = subtypeFn();
//            ^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int subtypeFn() {
  try {
    throw 2.5;
  } on num catch (e) {
    return 0;
  }
}

const var12 = orderFn();
//            ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
String orderFn() {
  String x = "st";
  try {
    x += "ri";
    throw 2;
  } catch (e) {
    x += "n";
  } finally {
    return x + "g";
  }
}

const var13 = notThrowStatement();
//            ^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int notThrowStatement() {
  int count = 0;
  try {
    for (int i = 0; i < 1; throw 'a') {
      count += i;
    }
  } catch (e) {
    return 1;
  }
  return 0;
}

void main() {
  Expect.equals(var1, 0);
  Expect.equals(var2, 1);
  Expect.equals(var3, 10);
  Expect.equals(var4, 1);
  Expect.equals(var5, 100);
  Expect.equals(var6, 100);
  Expect.equals(var7, 100);
  Expect.equals(var8, 100);
  Expect.equals(var9, 100);
  Expect.equals(var10, 0);
  Expect.equals(var11, 0);
  Expect.equals(var12, "string");
  Expect.equals(var13, 1);
}
