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

main() {
  // Error to assign to pattern variables in guard.
  switch (false) {
    case bool x when x = true:
      //             ^
      // [analyzer] COMPILE_TIME_ERROR.PATTERN_VARIABLE_ASSIGNMENT_INSIDE_GUARD
      // [cfe] Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
      print(x);
    default:
  }

  print(switch (false) {
    bool x when x = true => x,
    //          ^
    // [analyzer] COMPILE_TIME_ERROR.PATTERN_VARIABLE_ASSIGNMENT_INSIDE_GUARD
    // [cfe] Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
    _ => false
  });

  if (false case bool x when x = true) {
    //                       ^
    // [analyzer] COMPILE_TIME_ERROR.PATTERN_VARIABLE_ASSIGNMENT_INSIDE_GUARD
    // [cfe] Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
    print(x);
  }

  print([
    if (false case bool x when x = true)
      //                       ^
      // [analyzer] COMPILE_TIME_ERROR.PATTERN_VARIABLE_ASSIGNMENT_INSIDE_GUARD
      // [cfe] Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
      x
  ]);

  // Error even if assignment is nested inside closure.
  switch (false) {
    case var x
        when () {
          return x = true;
          //     ^
          // [analyzer] COMPILE_TIME_ERROR.PATTERN_VARIABLE_ASSIGNMENT_INSIDE_GUARD
          // [cfe] Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
        }():
      print(x);
    default:
  }

  print(switch (false) {
    var x
        when (() {
          return x = true;
          //     ^
          // [analyzer] COMPILE_TIME_ERROR.PATTERN_VARIABLE_ASSIGNMENT_INSIDE_GUARD
          // [cfe] Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
        })() =>
      x,
    _ => false
  });

  if (false case var x
      when (() {
        return x = true;
        //     ^
        // [analyzer] COMPILE_TIME_ERROR.PATTERN_VARIABLE_ASSIGNMENT_INSIDE_GUARD
        // [cfe] Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
      })()) {
    print(x);
  }

  print([
    if (false case var x
        when (() {
          return x = true;
          //     ^
          // [analyzer] COMPILE_TIME_ERROR.PATTERN_VARIABLE_ASSIGNMENT_INSIDE_GUARD
          // [cfe] Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
        })())
      x
  ]);

  // Not an error to assign to other variables.
  var local = false;
  switch (false) {
    case var x when local = true:
      // No error.
      print(x);
    default:
  }

  print(switch (false) {
    var x when local = true => x, // No error.
    _ => 0,
  });

  if (false case var x when local = true) {
    // No error.
    print(x);
  }

  print([
    if (false case var x when local = true) x // No error.
  ]);

  // Not an error to assign to pattern variables from other pattern.
  switch (false) {
    case bool x:
      switch (false) {
        case bool y when x = true:
          // No error.
          print(y);
        default:
      }

      print(switch (false) {
        bool y when x = true => y, // No error.
        _ => 0,
      });

      if (false case bool y when x = true) {
        // No error.
        print(y);
      }

      print([
        if (false case bool y when x = true) x // No error.
      ]);
  }
}
