// Copyright (c) 2019, 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:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/precedence.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:nnbd_migration/src/edit_plan.dart';
import 'package:nnbd_migration/src/utilities/hint_utils.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'abstract_single_unit.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(EditPlanTest);
    defineReflectiveTests(EndsInCascadeTest);
    defineReflectiveTests(PrecedenceTest);
  });
}

@reflectiveTest
class EditPlanTest extends AbstractSingleUnitTest {
  String? code;

  EditPlanner? _planner;

  @override
  bool get analyzeWithNnbd => true;

  EditPlanner? get planner {
    if (_planner == null) createPlanner();
    return _planner;
  }

  Future<void> analyze(String code) async {
    this.code = code;
    await resolveTestUnit(code);
  }

  Map<int?, List<AtomicEdit>> checkPlan(EditPlan plan, String expected,
      {String? expectedIncludingInformative}) {
    expectedIncludingInformative ??= expected;
    var changes = planner!.finalize(plan)!;
    expect(changes.applyTo(code!), expected);
    expect(changes.applyTo(code!, includeInformative: true),
        expectedIncludingInformative);
    return changes;
  }

  void createPlanner({bool removeViaComments = false}) {
    _planner = EditPlanner(testUnit!.lineInfo, code,
        removeViaComments: removeViaComments);
  }

  NodeProducingEditPlan extract(AstNode inner, AstNode? outer) =>
      planner!.extract(outer, planner!.passThrough(inner));

  Future<void> test_acceptLateHint() async {
    var code = '/* late */ int x = 0;';
    await analyze(code);
    var hint = getPrefixHint(findNode.simple('int').token)!;
    var changes = checkPlan(
        planner!.acceptPrefixHint(
            planner!.passThrough(findNode.simple('int')), hint),
        'late int x = 0;');
    expect(changes.keys, unorderedEquals([0, 7]));
    expect(changes[7], hasLength(1));
    expect(changes[7]![0].length, 3);
  }

  Future<void> test_acceptLateHint_space_needed_after() async {
    var code = '/* late */int x = 0;';
    await analyze(code);
    var hint = getPrefixHint(findNode.simple('int').token)!;
    checkPlan(
        planner!.acceptPrefixHint(
            planner!.passThrough(findNode.simple('int')), hint),
        'late int x = 0;');
  }

  Future<void> test_acceptLateHint_space_needed_before() async {
    var code = '@deprecated/* late */ int x = 0;';
    await analyze(code);
    var hint = getPrefixHint(findNode.simple('int').token)!;
    checkPlan(
        planner!.acceptPrefixHint(
            planner!.passThrough(findNode.simple('int')), hint),
        '@deprecated late int x = 0;');
  }

  Future<void>
      test_acceptNullabilityHint_function_typed_field_formal_parameter() async {
    await analyze('''
class C {
  void Function(int) f;
  C(void this.f(int i) /*?*/);
}
''');
    var parameter = findNode.fieldFormalParameter('void this.f(int i)');
    var typeName = planner!.passThrough(parameter);
    checkPlan(
        planner!.acceptSuffixHint(
            typeName, getPostfixHint(parameter.parameters!.rightParenthesis)!),
        '''
class C {
  void Function(int) f;
  C(void this.f(int i)?);
}
''');
  }

  Future<void> test_acceptNullabilityHint_function_typed_parameter() async {
    await analyze('f(void g(int i) /*?*/) {}');
    var parameter = findNode.functionTypedFormalParameter('void g(int i)');
    var typeName = planner!.passThrough(parameter);
    checkPlan(
        planner!.acceptSuffixHint(
            typeName, getPostfixHint(parameter.parameters.rightParenthesis)!),
        'f(void g(int i)?) {}');
  }

  Future<void> test_acceptNullabilityOrNullCheckHint() async {
    var code = 'int /*?*/ x = 0;';
    await analyze(code);
    var intRef = findNode.simple('int');
    var typeName = planner!.passThrough(intRef);
    checkPlan(
        planner!.acceptSuffixHint(typeName, getPostfixHint(intRef.token)!),
        'int? x = 0;');
  }

  Future<void> test_acceptNullabilityOrNullCheckHint_inside_extract() async {
    var code = 'f(x) => 3 * x /*!*/ * 4;';
    await analyze(code);
    var xRef = findNode.simple('x /*');
    checkPlan(
        planner!.extract(
            xRef.parent!.parent,
            planner!.acceptSuffixHint(
                planner!.passThrough(xRef), getPostfixHint(xRef.token)!)),
        'f(x) => x!;');
  }

  Future<void> test_addBinaryPostfix_assignment_right_associative() async {
    await analyze('_f(a, b, c) => a = b;');
    // Admittedly this is sort of a bogus test case, since the code it produces
    // (`(a = b) = c`) is non-grammatical.  But we still want to verify that it
    // *doesn't* produce `a = b = c`, which would be grammatical but which would
    // break apart the subexpression `a = b`.
    checkPlan(
        planner!.addBinaryPostfix(
            planner!.passThrough(findNode.assignment('a = b')),
            TokenType.EQ,
            'c'),
        '_f(a, b, c) => (a = b) = c;');
  }

  Future<void> test_addBinaryPostfix_associative() async {
    await analyze('var x = 1 - 2;');
    checkPlan(
        planner!.addBinaryPostfix(
            planner!.passThrough(findNode.binary('-')), TokenType.MINUS, '3'),
        'var x = 1 - 2 - 3;');
  }

  Future<void> test_addBinaryPostfix_endsInCascade() async {
    await analyze('f(x) => x..y = 1;');
    checkPlan(
        planner!.addBinaryPostfix(
            planner!.passThrough(findNode.integerLiteral('1')),
            TokenType.PLUS,
            '2'),
        'f(x) => x..y = 1 + 2;');
  }

  Future<void> test_addBinaryPostfix_equality_non_associative() async {
    await analyze('var x = 1 == 2;');
    checkPlan(
        planner!.addBinaryPostfix(
            planner!.passThrough(findNode.binary('==')), TokenType.EQ_EQ, '3'),
        'var x = (1 == 2) == 3;');
  }

  Future<void> test_addBinaryPostfix_inner_precedence() async {
    await analyze('var x = 1 < 2;');
    checkPlan(
        planner!.addBinaryPostfix(planner!.passThrough(findNode.binary('<')),
            TokenType.EQ_EQ, 'true'),
        'var x = 1 < 2 == true;');
    checkPlan(
        planner!.addBinaryPostfix(
            planner!.passThrough(findNode.binary('<')), TokenType.AS, 'bool'),
        'var x = (1 < 2) as bool;');
  }

  Future<void> test_addBinaryPostfix_outer_precedence() async {
    await analyze('var x = 1 == true;');
    checkPlan(
        planner!.addBinaryPostfix(
            planner!.passThrough(findNode.integerLiteral('1')),
            TokenType.LT,
            '2'),
        'var x = 1 < 2 == true;');
    checkPlan(
        planner!.addBinaryPostfix(
            planner!.passThrough(findNode.integerLiteral('1')),
            TokenType.EQ_EQ,
            '2'),
        'var x = (1 == 2) == true;');
  }

  Future<void> test_addBinaryPostfix_to_expression_function() async {
    await analyze('var x = () => null;');
    checkPlan(
        planner!.addBinaryPostfix(
            planner!.passThrough(findNode.functionExpression('()')),
            TokenType.AS,
            'Object'),
        'var x = (() => null) as Object;');
  }

  Future<void> test_addBinaryPrefix_allowCascade() async {
    await analyze('f(x) => 1..isEven;');
    checkPlan(
        planner!.addBinaryPrefix(
            'x..y', TokenType.EQ, planner!.passThrough(findNode.cascade('..'))),
        'f(x) => x..y = (1..isEven);');
    checkPlan(
        planner!.addBinaryPrefix(
            'x', TokenType.EQ, planner!.passThrough(findNode.cascade('..')),
            allowCascade: true),
        'f(x) => x = 1..isEven;');
  }

  Future<void> test_addBinaryPrefix_assignment_right_associative() async {
    await analyze('_f(a, b, c) => b = c;');
    checkPlan(
        planner!.addBinaryPrefix('a', TokenType.EQ,
            planner!.passThrough(findNode.assignment('b = c'))),
        '_f(a, b, c) => a = b = c;');
  }

  Future<void> test_addBinaryPrefix_associative() async {
    await analyze('var x = 1 - 2;');
    checkPlan(
        planner!.addBinaryPrefix(
            '0', TokenType.MINUS, planner!.passThrough(findNode.binary('-'))),
        'var x = 0 - (1 - 2);');
  }

  Future<void> test_addBinaryPrefix_outer_precedence() async {
    await analyze('var x = 2 == true;');
    checkPlan(
        planner!.addBinaryPrefix('1', TokenType.LT,
            planner!.passThrough(findNode.integerLiteral('2'))),
        'var x = 1 < 2 == true;');
    checkPlan(
        planner!.addBinaryPrefix('1', TokenType.EQ_EQ,
            planner!.passThrough(findNode.integerLiteral('2'))),
        'var x = (1 == 2) == true;');
  }

  Future<void> test_addBinaryPrefix_to_expression_function() async {
    await analyze('f(x) => () => null;');
    checkPlan(
        planner!.addBinaryPrefix('x', TokenType.EQ,
            planner!.passThrough(findNode.functionExpression('()'))),
        'f(x) => x = () => null;');
  }

  Future<void> test_addCommentPostfix_before_closer() async {
    await analyze('f(g) => g(0);');
    checkPlan(
        planner!.addCommentPostfix(
            planner!.passThrough(findNode.integerLiteral('0')), '/* zero */'),
        'f(g) => g(0 /* zero */);');
  }

  Future<void> test_addCommentPostfix_before_other() async {
    await analyze('f() => 0.isEven;');
    checkPlan(
        planner!.addCommentPostfix(
            planner!.passThrough(findNode.integerLiteral('0')), '/* zero */'),
        'f() => 0 /* zero */ .isEven;');
  }

  Future<void> test_addCommentPostfix_before_semicolon() async {
    await analyze('f() => 0;');
    checkPlan(
        planner!.addCommentPostfix(
            planner!.passThrough(findNode.integerLiteral('0')), '/* zero */'),
        'f() => 0 /* zero */;');
  }

  Future<void> test_addCommentPostfix_before_space() async {
    await analyze('f() => 0 + 1;');
    checkPlan(
        planner!.addCommentPostfix(
            planner!.passThrough(findNode.integerLiteral('0')), '/* zero */'),
        'f() => 0 /* zero */ + 1;');
  }

  Future<void> test_addCommentPostfix_informative() async {
    await analyze('f() => 0.isEven;');
    checkPlan(
        planner!.addCommentPostfix(
            planner!.passThrough(findNode.integerLiteral('0')), '/* zero */',
            isInformative: true),
        'f() => 0.isEven;',
        expectedIncludingInformative: 'f() => 0 /* zero */ .isEven;');
  }

  Future<void> test_addPostfix_inner_precedence_add_parens() async {
    await analyze('f(x) => -x;');
    checkPlan(
        planner!
            .addPostfix(planner!.passThrough(findNode.prefix('-x')), '.abs()'),
        'f(x) => (-x).abs();');
  }

  Future<void> test_addPostfix_inner_precedence_no_parens() async {
    await analyze('f(x) => x++;');
    checkPlan(
        planner!.addPostfix(
            planner!.passThrough(findNode.postfix('x++')), '.abs()'),
        'f(x) => x++.abs();');
  }

  Future<void> test_addPostfix_outer_precedence() async {
    await analyze('f(x) => x/*!*/;');
    checkPlan(
        planner!.addPostfix(
            planner!.passThrough(findNode.simple('x/*!*/')), '.abs()'),
        'f(x) => x.abs()/*!*/;');
  }

  Future<void> test_addUnaryPostfix_inner_precedence_add_parens() async {
    await analyze('f(x) => -x;');
    checkPlan(
        planner!.addUnaryPostfix(
            planner!.passThrough(findNode.prefix('-x')), TokenType.BANG),
        'f(x) => (-x)!;');
  }

  Future<void> test_addUnaryPostfix_inner_precedence_no_parens() async {
    await analyze('f(x) => x++;');
    checkPlan(
        planner!.addUnaryPostfix(
            planner!.passThrough(findNode.postfix('x++')), TokenType.BANG),
        'f(x) => x++!;');
  }

  Future<void> test_addUnaryPostfix_outer_precedence() async {
    await analyze('f(x) => x/*!*/;');
    checkPlan(
        planner!.addUnaryPostfix(
            planner!.passThrough(findNode.simple('x/*!*/')),
            TokenType.PLUS_PLUS),
        'f(x) => x++/*!*/;');
  }

  Future<void> test_addUnaryPrefix_inner_precedence_add_parens() async {
    await analyze('f(x, y) => x * y;');
    checkPlan(
        planner!.addUnaryPrefix(
            TokenType.MINUS, planner!.passThrough(findNode.binary('*'))),
        'f(x, y) => -(x * y);');
  }

  Future<void> test_addUnaryPrefix_inner_precedence_no_parens() async {
    await analyze('f(x) => -x;');
    // TODO(paulberry): if we added a `-` instead of a `~`, the result would
    // scan as a single `--` token, so we would need parens.  Add support for
    // this corner case.
    checkPlan(
        planner!.addUnaryPrefix(
            TokenType.TILDE, planner!.passThrough(findNode.prefix('-x'))),
        'f(x) => ~-x;');
  }

  Future<void> test_addUnaryPrefix_outer_precedence_add_parens() async {
    await analyze('f(x) => x!;');
    checkPlan(
        planner!.addUnaryPrefix(
            TokenType.MINUS, planner!.passThrough(findNode.simple('x!'))),
        'f(x) => (-x)!;');
  }

  Future<void> test_addUnaryPrefix_outer_precedence_no_parens() async {
    await analyze('f(x) => -x;');
    // TODO(paulberry): if we added a `-` instead of a `~`, the result would
    // scan as a single `--` token, so we would need parens.  Add support for
    // this corner case.
    checkPlan(
        planner!.addUnaryPrefix(
            TokenType.TILDE, planner!.passThrough(findNode.simple('x;'))),
        'f(x) => -~x;');
  }

  Future<void> test_cascadeSearchLimit() async {
    // Ok, we have to ask each parent if it represents a cascade section.
    // If we create a passThrough at node N, then when we create an enclosing
    // passThrough, the first thing we'll check is N's parent.
    await analyze('f(a, c) => a..b = c = 1;');
    var cascade = findNode.cascade('..');
    var outerAssignment = findNode.assignment('= c');
    assert(identical(cascade, outerAssignment.parent));
    var innerAssignment = findNode.assignment('= 1');
    assert(identical(outerAssignment, innerAssignment.parent));
    var one = findNode.integerLiteral('1');
    assert(identical(innerAssignment, one.parent));
    // The tests below will be based on an inner plan that adds `..isEven` after
    // the `1`.
    EditPlan makeInnerPlan() => planner!.surround(planner!.passThrough(one),
        suffix: [AtomicEdit.insert('..isEven')], endsInCascade: true);
    {
      // If we make a plan that passes through `c = 1`, containing a plan that
      // adds `..isEven` to `1`, then we don't necessarily want to add parens yet,
      // because we might not keep the cascade section above it.
      var plan =
          planner!.passThrough(innerAssignment, innerPlans: [makeInnerPlan()]);
      // `endsInCascade` returns true because we haven't committed to adding
      // parens, so we need to remember that the presence of `..isEven` may
      // require parens later.
      expect(plan.endsInCascade, true);
      checkPlan(planner!.extract(cascade, plan), 'f(a, c) => c = 1..isEven;');
    }
    {
      // If we make a plan that passes through `..b = c = 1`, containing a plan
      // that adds `..isEven` to `1`, then we do necessarily want to add parens,
      // because we're committed to keeping the cascade section.
      var plan =
          planner!.passThrough(outerAssignment, innerPlans: [makeInnerPlan()]);
      // We can tell that the parens have been finalized because `endsInCascade`
      // returns false now.
      expect(plan.endsInCascade, false);
      checkPlan(plan, 'f(a, c) => a..b = (c = 1..isEven);');
    }
  }

  Future<void> test_dropNullabilityHint() async {
    var code = 'int /*!*/ x = 0;';
    await analyze(code);
    var intRef = findNode.simple('int');
    var typeName = planner!.passThrough(intRef);
    checkPlan(
        planner!.dropNullabilityHint(typeName, getPostfixHint(intRef.token)!),
        'int x = 0;');
  }

  Future<void> test_dropNullabilityHint_space_before_must_be_kept() async {
    var code = 'int /*!*/x = 0;';
    await analyze(code);
    var intRef = findNode.simple('int');
    var typeName = planner!.passThrough(intRef);
    var changes = checkPlan(
        planner!.dropNullabilityHint(typeName, getPostfixHint(intRef.token)!),
        'int x = 0;');
    expect(changes.keys, unorderedEquals([code.indexOf('/*')]));
  }

  Future<void> test_dropNullabilityHint_space_needed() async {
    var code = 'int/*!*/x = 0;';
    await analyze(code);
    var intRef = findNode.simple('int');
    var typeName = planner!.passThrough(intRef);
    checkPlan(
        planner!.dropNullabilityHint(typeName, getPostfixHint(intRef.token)!),
        'int x = 0;');
  }

  Future<void> test_dropNullabilityHint_tight_no_space_needed() async {
    // We try to minimize how much we alter the source code, so we don't insert
    // a space in this example even though it would look prettier to do so.
    var code = 'void Function()/*!*/x = () {};';
    await analyze(code);
    var functionType = findNode.genericFunctionType('Function');
    var typeName = planner!.passThrough(functionType);
    checkPlan(
        planner!.dropNullabilityHint(
            typeName, getPostfixHint(functionType.endToken)!),
        'void Function()x = () {};');
  }

  Future<void> test_explainNonNullable() async {
    await analyze('int x = 0;');
    checkPlan(
        planner!.explainNonNullable(
            planner!.passThrough(findNode.typeAnnotation('int'))),
        'int x = 0;',
        expectedIncludingInformative: 'int  x = 0;');
  }

  Future<void> test_extract_add_parens() async {
    await analyze('f(g) => 1 * g(2, 3 + 4, 5);');
    checkPlan(
        extract(
            findNode.binary('+'), findNode.functionExpressionInvocation('+')),
        'f(g) => 1 * (3 + 4);');
  }

  Future<void> test_extract_inner_endsInCascade() async {
    await analyze('f(a, g) => a..b = g(0, 1..isEven, 2);');
    expect(
        extract(findNode.cascade('1..isEven'),
                findNode.functionExpressionInvocation('g('))
            .endsInCascade,
        true);
    expect(
        extract(findNode.integerLiteral('1'),
                findNode.functionExpressionInvocation('g('))
            .endsInCascade,
        false);
  }

  Future<void> test_extract_left() async {
    await analyze('var x = 1 + 2;');
    checkPlan(extract(findNode.integerLiteral('1'), findNode.binary('+')),
        'var x = 1;');
  }

  Future<void> test_extract_no_parens_needed() async {
    await analyze('var x = 1 + 2 * 3;');
    checkPlan(extract(findNode.integerLiteral('2'), findNode.binary('*')),
        'var x = 1 + 2;');
  }

  Future<void> test_extract_preserve_parens() async {
    // Note: extra spaces to verify that we are really preserving the parens
    // rather than removing them and adding new ones.
    await analyze('var x = ( 1 << 2 ) * 3 + 4;');
    checkPlan(extract(findNode.binary('<<'), findNode.binary('*')),
        'var x = ( 1 << 2 ) + 4;');
  }

  Future<void> test_extract_remove_parens() async {
    await analyze('var x = (1 + 2) * 3 << 4;');
    checkPlan(extract(findNode.binary('+'), findNode.binary('*')),
        'var x = 1 + 2 << 4;');
  }

  Future<void> test_extract_remove_redundant_parens() async {
    await analyze('var x = (1 * 2) + 3;');
    var times = findNode.binary('*');
    checkPlan(extract(times, times.parent), 'var x = 1 * 2 + 3;');
  }

  Future<void> test_extract_try_to_remove_necessary_parens() async {
    // This is a weird corner case.  We try to extract the expression `1 + 2`
    // from `( 1 + 2 )`, meaning we should remove parens.  But the parens are
    // necessary.  So we create fresh ones (without the spaces).
    await analyze('var x = ( 1 + 2 ) * 3;');
    var plus = findNode.binary('+');
    checkPlan(extract(plus, plus.parent), 'var x = (1 + 2) * 3;');
  }

  Future<void> test_extract_using_comments_inner() async {
    await analyze('var x = 1 + 2 * 3;');
    createPlanner(removeViaComments: true);
    checkPlan(extract(findNode.integerLiteral('2'), findNode.binary('+')),
        'var x = /* 1 + */ 2 /* * 3 */;');
  }

  Future<void> test_extract_using_comments_left() async {
    await analyze('var x = 1 + 2;');
    createPlanner(removeViaComments: true);
    checkPlan(extract(findNode.integerLiteral('1'), findNode.binary('+')),
        'var x = 1 /* + 2 */;');
  }

  Future<void> test_extract_using_comments_right() async {
    await analyze('var x = 1 + 2;');
    createPlanner(removeViaComments: true);
    checkPlan(extract(findNode.integerLiteral('2'), findNode.binary('+')),
        'var x = /* 1 + */ 2;');
  }

  Future<void> test_finalize_compilationUnit() async {
    // Verify that an edit plan referring to the entire compilation unit can be
    // finalized.  (This is an important corner case because the entire
    // compilation unit is an AstNode with no parent).
    await analyze('var x = 0;');
    checkPlan(
        planner!.surround(planner!.passThrough(testUnit),
            suffix: [AtomicEdit.insert(' var y = 0;')]),
        'var x = 0; var y = 0;');
  }

  Future<void> test_informativeMessageForToken() async {
    await analyze('f(x) => x + 1;');
    var sum = findNode.binary('+');
    var info = _MockInfo();
    var changes = checkPlan(
        planner!.passThrough(sum, innerPlans: [
          planner!.informativeMessageForToken(sum, sum.operator, info: info)
        ]),
        'f(x) => x + 1;',
        expectedIncludingInformative: 'f(x) => x  1;');
    var expectedOffset = sum.operator.offset;
    expect(changes.keys, unorderedEquals([expectedOffset]));
    expect(changes[expectedOffset], hasLength(1));
    expect(changes[expectedOffset]![0].length, '+'.length);
    expect(changes[expectedOffset]![0].replacement, '');
    expect(changes[expectedOffset]![0].isInformative, isTrue);
    expect(changes[expectedOffset]![0].info, same(info));
  }

  Future<void> test_insertText() async {
    await analyze('final x = 1;');
    var variableDeclarationList = findNode.variableDeclarationList('final');
    checkPlan(
        planner!.insertText(
            variableDeclarationList,
            variableDeclarationList.variables.first.offset,
            [AtomicEdit.insert('int ')]),
        'final int x = 1;');
  }

  Future<void> test_makeNullable() async {
    await analyze('int x = 0;');
    checkPlan(
        planner!
            .makeNullable(planner!.passThrough(findNode.typeAnnotation('int'))),
        'int? x = 0;');
  }

  Future<void> test_passThrough_remove_statement() async {
    await analyze('''
void f() {
  var x = () {
    1;
    2;
    3;
  };
}
''');
    var innerPlan = planner!.removeNode(findNode.statement('2'));
    var outerPlan = planner!.passThrough(findNode.variableDeclaration('x'),
        innerPlans: [innerPlan]);
    checkPlan(outerPlan, '''
void f() {
  var x = () {
    1;
    3;
  };
}
''');
  }

  Future<void> test_remove_all_list_elements_with_trailing_separator() async {
    await analyze('var x = [ 1, 2, ];');
    var i1 = findNode.integerLiteral('1');
    var i2 = findNode.integerLiteral('2');
    checkPlan(
        planner!.passThrough(i1.parent,
            innerPlans: [planner!.removeNode(i1), planner!.removeNode(i2)]),
        'var x = [];');
  }

  Future<void> test_remove_argument() async {
    await analyze('f(dynamic d) => d(1, 2, 3);');
    var i2 = findNode.integerLiteral('2');
    var changes =
        checkPlan(planner!.removeNode(i2), 'f(dynamic d) => d(1, 3);');
    expect(changes.keys, [i2.offset]);
  }

  Future<void> test_remove_class_member() async {
    await analyze('''
class C {
  int? x;
  int? y;
  int? z;
}
''');
    var declaration = findNode.fieldDeclaration('y');
    var changes = checkPlan(planner!.removeNode(declaration), '''
class C {
  int? x;
  int? z;
}
''');
    expect(changes.keys, [declaration.offset - 2]);
  }

  Future<void>
      test_remove_elements_of_related_lists_at_different_levels() async {
    await analyze('var x = [[1, 2], 3, 4];');
    var i2 = findNode.integerLiteral('2');
    var i3 = findNode.integerLiteral('3');
    checkPlan(
        planner!.passThrough(testUnit,
            innerPlans: [planner!.removeNode(i2), planner!.removeNode(i3)]),
        'var x = [[1], 4];');
  }

  Future<void>
      test_remove_elements_of_sibling_lists_passThrough_container() async {
    await analyze('var x = [[1, 2], [3, 4]];');
    var i2 = findNode.integerLiteral('2');
    var i3 = findNode.integerLiteral('3');
    checkPlan(
        planner!.passThrough(i2.parent!.parent,
            innerPlans: [planner!.removeNode(i2), planner!.removeNode(i3)]),
        'var x = [[1], [4]];');
  }

  Future<void> test_remove_elements_of_sibling_lists_passThrough_unit() async {
    await analyze('var x = [[1, 2], [3, 4]];');
    var i2 = findNode.integerLiteral('2');
    var i3 = findNode.integerLiteral('3');
    checkPlan(
        planner!.passThrough(testUnit,
            innerPlans: [planner!.removeNode(i2), planner!.removeNode(i3)]),
        'var x = [[1], [4]];');
  }

  Future<void> test_remove_enum_constant() async {
    await analyze('''
enum E {
  A,
  B,
  C
}
''');
    var enumConstant = findNode.enumConstantDeclaration('B');
    var changes = checkPlan(planner!.removeNode(enumConstant), '''
enum E {
  A,
  C
}
''');
    expect(changes.keys, [enumConstant.offset - 2]);
  }

  Future<void> test_remove_field_declaration() async {
    await analyze('''
class C {
  int? x, y, z;
}
''');
    var declaration = findNode.variableDeclaration('y');
    var changes = checkPlan(planner!.removeNode(declaration), '''
class C {
  int? x, z;
}
''');
    expect(changes.keys, [declaration.offset]);
  }

  Future<void> test_remove_list_element() async {
    await analyze('var x = [1, 2, 3];');
    var i2 = findNode.integerLiteral('2');
    var changes = checkPlan(planner!.removeNode(i2), 'var x = [1, 3];');
    expect(changes.keys, [i2.offset]);
  }

  Future<void> test_remove_list_element_at_list_end() async {
    await analyze('var x = [1, 2, 3];');
    var i2 = findNode.integerLiteral('2');
    var i3 = findNode.integerLiteral('3');
    var changes = checkPlan(planner!.removeNode(i3), 'var x = [1, 2];');
    expect(changes.keys, [i2.end]);
  }

  Future<void> test_remove_list_element_singleton() async {
    await analyze('var x = [1];');
    var i1 = findNode.integerLiteral('1');
    checkPlan(planner!.removeNode(i1), 'var x = [];');
  }

  Future<void> test_remove_list_element_with_trailing_separator() async {
    await analyze('var x = [1, 2, 3, ];');
    var i3 = findNode.integerLiteral('3');
    checkPlan(planner!.removeNode(i3), 'var x = [1, 2, ];');
  }

  Future<void> test_remove_list_elements() async {
    await analyze('var x = [1, 2, 3, 4, 5];');
    var i2 = findNode.integerLiteral('2');
    var i4 = findNode.integerLiteral('4');
    var changes = checkPlan(
        planner!.passThrough(i2.parent,
            innerPlans: [planner!.removeNode(i2), planner!.removeNode(i4)]),
        'var x = [1, 3, 5];');
    expect(changes.keys, unorderedEquals([i2.offset, i4.offset]));
  }

  Future<void> test_remove_list_elements_all() async {
    await analyze('var x = [1, 2];');
    var i1 = findNode.integerLiteral('1');
    var i2 = findNode.integerLiteral('2');
    checkPlan(
        planner!.passThrough(i1.parent,
            innerPlans: [planner!.removeNode(i1), planner!.removeNode(i2)]),
        'var x = [];');
  }

  Future<void> test_remove_list_elements_all_asUnit() async {
    await analyze('var x = [1, 2];');
    var i1 = findNode.integerLiteral('1');
    var i2 = findNode.integerLiteral('2');
    checkPlan(planner!.removeNodes(i1, i2), 'var x = [];');
  }

  Future<void> test_remove_list_elements_all_passThrough_unit() async {
    await analyze('var x = [1, 2];');
    var i1 = findNode.integerLiteral('1');
    var i2 = findNode.integerLiteral('2');
    checkPlan(
        planner!.passThrough(testUnit,
            innerPlans: [planner!.removeNode(i1), planner!.removeNode(i2)]),
        'var x = [];');
  }

  Future<void> test_remove_list_elements_at_list_end() async {
    await analyze('var x = [1, 2, 3];');
    var i1 = findNode.integerLiteral('1');
    var i2 = findNode.integerLiteral('2');
    var i3 = findNode.integerLiteral('3');
    var changes = checkPlan(
        planner!.passThrough(i2.parent,
            innerPlans: [planner!.removeNode(i2), planner!.removeNode(i3)]),
        'var x = [1];');
    expect(changes.keys, unorderedEquals([i1.end, i2.end]));
  }

  Future<void> test_remove_list_elements_at_list_end_asUnit() async {
    await analyze('var x = [1, 2, 3];');
    var i1 = findNode.integerLiteral('1');
    var i2 = findNode.integerLiteral('2');
    var i3 = findNode.integerLiteral('3');
    var changes = checkPlan(planner!.removeNodes(i2, i3), 'var x = [1];');
    expect(changes.keys, [i1.end]);
  }

  Future<void> test_remove_list_elements_consecutive_asUnit() async {
    await analyze('var x = [1, 2, 3, 4];');
    var i2 = findNode.integerLiteral('2');
    var i3 = findNode.integerLiteral('3');
    var changes = checkPlan(planner!.removeNodes(i2, i3), 'var x = [1, 4];');
    expect(changes.keys, [i2.offset]);
  }

  Future<void>
      test_remove_list_elements_consecutive_at_list_end_using_comments() async {
    await analyze('var x = [1, 2, 3];');
    var i2 = findNode.integerLiteral('2');
    var i3 = findNode.integerLiteral('3');
    createPlanner(removeViaComments: true);
    checkPlan(
        planner!.passThrough(i2.parent,
            innerPlans: [planner!.removeNode(i2), planner!.removeNode(i3)]),
        'var x = [1/* , 2 *//* , 3 */];');
  }

  Future<void> test_remove_list_elements_consecutive_using_comments() async {
    await analyze('var x = [1, 2, 3, 4];');
    var i2 = findNode.integerLiteral('2');
    var i3 = findNode.integerLiteral('3');
    createPlanner(removeViaComments: true);
    checkPlan(
        planner!.passThrough(i2.parent,
            innerPlans: [planner!.removeNode(i2), planner!.removeNode(i3)]),
        'var x = [1, /* 2, */ /* 3, */ 4];');
  }

  Future<void> test_remove_list_elements_using_comments() async {
    await analyze('var x = [1, 2, 3, 4, 5];');
    var i2 = findNode.integerLiteral('2');
    var i4 = findNode.integerLiteral('4');
    createPlanner(removeViaComments: true);
    checkPlan(
        planner!.passThrough(i2.parent,
            innerPlans: [planner!.removeNode(i2), planner!.removeNode(i4)]),
        'var x = [1, /* 2, */ 3, /* 4, */ 5];');
  }

  Future<void> test_remove_map_element() async {
    await analyze('var x = {1: 2, 3: 4, 5: 6};');
    var entry = findNode.integerLiteral('3').parent!;
    var changes =
        checkPlan(planner!.removeNode(entry), 'var x = {1: 2, 5: 6};');
    expect(changes.keys, [entry.offset]);
  }

  Future<void>
      test_remove_metadata_from_defaultFormalParameter_all_full_line() async {
    await analyze('''
f({
  @deprecated
  int? x}) {}''');
    var deprecated = findNode.annotation('@deprecated');
    checkPlan(
        planner!.passThrough(deprecated.parent,
            innerPlans: [planner!.removeNode(deprecated)]),
        '''
f({
  int? x}) {}''');
  }

  Future<void> test_remove_metadata_from_method_declaration() async {
    await analyze('''
class C {
  @deprecated
  f() {}
}
''');
    var deprecated = findNode.annotation('@deprecated');
    checkPlan(
        planner!.passThrough(deprecated.parent,
            innerPlans: [planner!.removeNode(deprecated)]),
        '''
class C {
  f() {}
}
''');
  }

  Future<void> test_remove_parameter() async {
    await analyze('f(int x, int y, int z) => null;');
    var parameter = findNode.simpleFormalParameter('y');
    var changes =
        checkPlan(planner!.removeNode(parameter), 'f(int x, int z) => null;');
    expect(changes.keys, [parameter.offset]);
  }

  Future<void> test_remove_set_element() async {
    await analyze('var x = {1, 2, 3};');
    var i2 = findNode.integerLiteral('2');
    var changes = checkPlan(planner!.removeNode(i2), 'var x = {1, 3};');
    expect(changes.keys, [i2.offset]);
  }

  Future<void> test_remove_statement() async {
    await analyze('''
void f() {
  1;
  2;
  3;
}
''');
    checkPlan(planner!.removeNode(findNode.statement('2')), '''
void f() {
  1;
  3;
}
''');
  }

  Future<void> test_remove_statement_first_of_many_on_line() async {
    await analyze('''
void f() {
  1;
  2; 3;
  4;
}
''');
    checkPlan(planner!.removeNode(findNode.statement('2')), '''
void f() {
  1;
  3;
  4;
}
''');
  }

  Future<void> test_remove_statement_last_of_many_on_line() async {
    await analyze('''
void f() {
  1;
  2; 3;
  4;
}
''');
    checkPlan(planner!.removeNode(findNode.statement('3')), '''
void f() {
  1;
  2;
  4;
}
''');
  }

  Future<void> test_remove_statement_middle_of_many_on_line() async {
    await analyze('''
void f() {
  1;
  2; 3; 4;
  5;
}
''');
    checkPlan(planner!.removeNode(findNode.statement('3')), '''
void f() {
  1;
  2; 4;
  5;
}
''');
  }

  Future<void> test_remove_statement_using_comments() async {
    await analyze('''
void f() {
  1;
  2;
  3;
}
''');
    createPlanner(removeViaComments: true);
    checkPlan(planner!.removeNode(findNode.statement('2')), '''
void f() {
  1;
  /* 2; */
  3;
}
''');
  }

  Future<void> test_remove_statements_asUnit() async {
    await analyze('''
void f() {
  1;
  2;

  3;
  4;
}
''');
    var s2 = findNode.statement('2');
    var s3 = findNode.statement('3');
    var changes = checkPlan(planner!.removeNodes(s2, s3), '''
void f() {
  1;
  4;
}
''');
    expect(changes, hasLength(1));
  }

  Future<void> test_remove_statements_consecutive_three() async {
    await analyze('''
void f() {
  1;
  2;

  3;

  4;
  5;
}
''');
    var s2 = findNode.statement('2');
    var s3 = findNode.statement('3');
    var s4 = findNode.statement('4');
    var changes = checkPlan(
        planner!.passThrough(s2.parent, innerPlans: [
          planner!.removeNode(s2),
          planner!.removeNode(s3),
          planner!.removeNode(s4)
        ]),
        '''
void f() {
  1;
  5;
}
''');
    expect(changes.keys,
        unorderedEquals([s2.offset - 2, s3.offset - 2, s4.offset - 2]));
  }

  Future<void> test_remove_statements_consecutive_two() async {
    await analyze('''
void f() {
  1;
  2;

  3;
  4;
}
''');
    var s2 = findNode.statement('2');
    var s3 = findNode.statement('3');
    var changes = checkPlan(
        planner!.passThrough(s2.parent,
            innerPlans: [planner!.removeNode(s2), planner!.removeNode(s3)]),
        '''
void f() {
  1;
  4;
}
''');
    expect(changes.keys, unorderedEquals([s2.offset - 2, s3.offset - 2]));
  }

  Future<void> test_remove_statements_nonconsecutive() async {
    await analyze('''
void f() {
  1;
  2;
  3;
  4;
  5;
}
''');
    var s2 = findNode.statement('2');
    var s4 = findNode.statement('4');
    var changes = checkPlan(
        planner!.passThrough(s2.parent,
            innerPlans: [planner!.removeNode(s2), planner!.removeNode(s4)]),
        '''
void f() {
  1;
  3;
  5;
}
''');
    expect(changes, hasLength(2));
  }

  Future<void> test_remove_statements_singleton() async {
    await analyze('''
void f() {
  1;
}
''');
    checkPlan(planner!.removeNode(findNode.statement('1')), '''
void f() {}
''');
  }

  Future<void> test_remove_statements_singleton_with_following_comment() async {
    await analyze('''
void f() {
  1;
  // Foo
}
''');
    checkPlan(planner!.removeNode(findNode.statement('1')), '''
void f() {
  // Foo
}
''');
  }

  Future<void> test_remove_statements_singleton_with_preceding_comment() async {
    await analyze('''
void f() {
  // Foo
  1;
}
''');
    checkPlan(planner!.removeNode(findNode.statement('1')), '''
void f() {
  // Foo
}
''');
  }

  Future<void> test_remove_statements_using_comments() async {
    await analyze('''
void f() {
  1;
  2;
  3;
  4;
}
''');
    createPlanner(removeViaComments: true);
    var s2 = findNode.statement('2');
    var s3 = findNode.statement('3');
    checkPlan(
        planner!.passThrough(s2.parent,
            innerPlans: [planner!.removeNode(s2), planner!.removeNode(s3)]),
        '''
void f() {
  1;
  /* 2; */
  /* 3; */
  4;
}
''');
  }

  Future<void> test_remove_top_level_declaration() async {
    await analyze('''
class C {}
class D {}
class E {}
''');
    var declaration = findNode.classDeclaration('D');
    var changes = checkPlan(planner!.removeNode(declaration), '''
class C {}
class E {}
''');
    expect(changes.keys, [declaration.offset]);
  }

  Future<void> test_remove_top_level_directive() async {
    await analyze('''
import 'dart:io';
import 'dart:async';
import 'dart:math';
''');
    var directive = findNode.import('async');
    var changes = checkPlan(planner!.removeNode(directive), '''
import 'dart:io';
import 'dart:math';
''');
    expect(changes.keys, [directive.offset]);
  }

  Future<void> test_remove_type_argument() async {
    await analyze('''
class C<T, U, V> {}
C<int, double, String>? c;
''');
    var typeArgument = findNode.simple('double').parent!;
    var changes = checkPlan(planner!.removeNode(typeArgument), '''
class C<T, U, V> {}
C<int, String>? c;
''');
    expect(changes.keys, [typeArgument.offset]);
  }

  Future<void> test_remove_type_parameter() async {
    await analyze('class C<T, U, V> {}');
    var parameter = findNode.typeParameter('U');
    var changes = checkPlan(planner!.removeNode(parameter), 'class C<T, V> {}');
    expect(changes.keys, [parameter.offset]);
  }

  Future<void> test_remove_variable_declaration() async {
    await analyze('int? x, y, z;');
    var declaration = findNode.variableDeclaration('y');
    var changes = checkPlan(planner!.removeNode(declaration), 'int? x, z;');
    expect(changes.keys, [declaration.offset]);
  }

  Future<void>
      test_removeNullAwarenessFromMethodInvocation_change_arguments() async {
    await analyze('f(x) => x?.m(0);');
    var methodInvocation = findNode.methodInvocation('?.');
    checkPlan(
        planner!.passThrough(methodInvocation, innerPlans: [
          planner!.removeNullAwareness(methodInvocation),
          planner!.passThrough(methodInvocation.argumentList, innerPlans: [
            planner!
                .replace(findNode.integerLiteral('0'), [AtomicEdit.insert('1')])
          ])
        ]),
        'f(x) => x.m(1);');
  }

  Future<void>
      test_removeNullAwarenessFromMethodInvocation_change_methodName() async {
    await analyze('f(x) => x?.m();');
    var methodInvocation = findNode.methodInvocation('?.');
    checkPlan(
        planner!.passThrough(methodInvocation, innerPlans: [
          planner!.removeNullAwareness(methodInvocation),
          planner!.replace(findNode.simple('m'), [AtomicEdit.insert('n')])
        ]),
        'f(x) => x.n();');
  }

  Future<void>
      test_removeNullAwarenessFromMethodInvocation_change_target() async {
    await analyze('f(x) => x?.m();');
    var methodInvocation = findNode.methodInvocation('?.');
    checkPlan(
        planner!.passThrough(methodInvocation, innerPlans: [
          planner!.replace(findNode.simple('x?.'), [AtomicEdit.insert('y')]),
          planner!.removeNullAwareness(methodInvocation)
        ]),
        'f(x) => y.m();');
  }

  Future<void>
      test_removeNullAwarenessFromMethodInvocation_change_typeArguments() async {
    await analyze('f(x) => x?.m<int>();');
    var methodInvocation = findNode.methodInvocation('?.');
    checkPlan(
        planner!.passThrough(methodInvocation, innerPlans: [
          planner!.removeNullAwareness(methodInvocation),
          planner!.passThrough(methodInvocation.typeArguments, innerPlans: [
            planner!.replace(findNode.simple('int'), [AtomicEdit.insert('num')])
          ])
        ]),
        'f(x) => x.m<num>();');
  }

  Future<void> test_removeNullAwarenessFromMethodInvocation_simple() async {
    await analyze('f(x) => x?.m();');
    var methodInvocation = findNode.methodInvocation('?.');
    checkPlan(
        planner!.passThrough(methodInvocation,
            innerPlans: [planner!.removeNullAwareness(methodInvocation)]),
        'f(x) => x.m();');
  }

  Future<void> test_removeNullAwarenessFromPropertyAccess_change_both() async {
    await analyze('f(x) => x?.y;');
    var propertyAccess = findNode.propertyAccess('?.');
    checkPlan(
        planner!.passThrough(propertyAccess, innerPlans: [
          (planner!.replace(findNode.simple('x?.'), [AtomicEdit.insert('z')])),
          planner!.removeNullAwareness(propertyAccess),
          planner!.replace(findNode.simple('y'), [AtomicEdit.insert('w')])
        ]),
        'f(x) => z.w;');
  }

  Future<void>
      test_removeNullAwarenessFromPropertyAccess_change_propertyName() async {
    await analyze('f(x) => x?.y;');
    var propertyAccess = findNode.propertyAccess('?.');
    checkPlan(
        planner!.passThrough(propertyAccess, innerPlans: [
          planner!.removeNullAwareness(propertyAccess),
          planner!.replace(findNode.simple('y'), [AtomicEdit.insert('w')])
        ]),
        'f(x) => x.w;');
  }

  Future<void>
      test_removeNullAwarenessFromPropertyAccess_change_target() async {
    await analyze('f(x) => x?.y;');
    var propertyAccess = findNode.propertyAccess('?.');
    checkPlan(
        planner!.passThrough(propertyAccess, innerPlans: [
          planner!.replace(findNode.simple('x?.'), [AtomicEdit.insert('z')]),
          planner!.removeNullAwareness(propertyAccess)
        ]),
        'f(x) => z.y;');
  }

  Future<void> test_removeNullAwarenessFromPropertyAccess_simple() async {
    await analyze('f(x) => x?.y;');
    var propertyAccess = findNode.propertyAccess('?.');
    checkPlan(
        planner!.passThrough(propertyAccess,
            innerPlans: [planner!.removeNullAwareness(propertyAccess)]),
        'f(x) => x.y;');
  }

  Future<void> test_replace_expression() async {
    await analyze('var x = 1 + 2 * 3;');
    checkPlan(planner!.replace(findNode.binary('*'), [AtomicEdit.insert('6')]),
        'var x = 1 + 6;');
  }

  Future<void> test_replace_expression_add_parens_due_to_cascade() async {
    await analyze('var x = 1 + 2 * 3;');
    checkPlan(
        planner!.replace(findNode.binary('*'), [AtomicEdit.insert('4..isEven')],
            endsInCascade: true),
        'var x = 1 + (4..isEven);');
  }

  Future<void> test_replace_expression_add_parens_due_to_precedence() async {
    await analyze('var x = 1 + 2 * 3;');
    checkPlan(
        planner!.replace(findNode.binary('*'), [AtomicEdit.insert('y = z')],
            precedence: Precedence.assignment),
        'var x = 1 + (y = z);');
  }

  Future<void> test_replaceToken() async {
    await analyze('var x = 1;');
    var variableDeclarationList = findNode.variableDeclarationList('var x');
    checkPlan(
        planner!.replaceToken(
            variableDeclarationList, variableDeclarationList.keyword!, 'int'),
        'int x = 1;');
  }

  Future<void> test_surround_allowCascade() async {
    await analyze('f(x) => 1..isEven;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.cascade('..')),
            prefix: [AtomicEdit.insert('x..y = ')]),
        'f(x) => x..y = (1..isEven);');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.cascade('..')),
            prefix: [AtomicEdit.insert('x = ')], allowCascade: true),
        'f(x) => x = 1..isEven;');
  }

  Future<void> test_surround_associative() async {
    await analyze('var x = 1 - 2;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.binary('-')),
            suffix: [AtomicEdit.insert(' - 3')],
            innerPrecedence: Precedence.additive,
            associative: true),
        'var x = 1 - 2 - 3;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.binary('-')),
            prefix: [AtomicEdit.insert('0 - ')],
            innerPrecedence: Precedence.additive),
        'var x = 0 - (1 - 2);');
  }

  Future<void> test_surround_endsInCascade() async {
    await analyze('f(x) => x..y = 1;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.integerLiteral('1')),
            suffix: [AtomicEdit.insert(' + 2')]),
        'f(x) => x..y = 1 + 2;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.integerLiteral('1')),
            suffix: [AtomicEdit.insert('..isEven')], endsInCascade: true),
        'f(x) => x..y = (1..isEven);');
  }

  Future<void>
      test_surround_endsInCascade_does_not_propagate_through_added_parens() async {
    await analyze('f(a) => a..b = 0;');
    checkPlan(
        planner!.surround(
            planner!.surround(planner!.passThrough(findNode.cascade('..')),
                prefix: [AtomicEdit.insert('1 + ')],
                innerPrecedence: Precedence.additive),
            prefix: [AtomicEdit.insert('true ? ')],
            suffix: [AtomicEdit.insert(' : 2')]),
        'f(a) => true ? 1 + (a..b = 0) : 2;');
    checkPlan(
        planner!.surround(
            planner!.surround(planner!.passThrough(findNode.cascade('..')),
                prefix: [AtomicEdit.insert('throw ')], allowCascade: true),
            prefix: [AtomicEdit.insert('true ? ')],
            suffix: [AtomicEdit.insert(' : 2')]),
        'f(a) => true ? (throw a..b = 0) : 2;');
  }

  Future<void> test_surround_endsInCascade_internal_throw() async {
    await analyze('f(x, g) => g(0, throw x, 1);');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.simple('x, 1')),
            suffix: [AtomicEdit.insert('..y')], endsInCascade: true),
        'f(x, g) => g(0, throw x..y, 1);');
  }

  Future<void> test_surround_endsInCascade_propagates() async {
    await analyze('f(a) => a..b = 0;');
    checkPlan(
        planner!.surround(
            planner!.surround(planner!.passThrough(findNode.cascade('..')),
                prefix: [AtomicEdit.insert('throw ')], allowCascade: true),
            prefix: [AtomicEdit.insert('true ? ')],
            suffix: [AtomicEdit.insert(' : 2')]),
        'f(a) => true ? (throw a..b = 0) : 2;');
    checkPlan(
        planner!.surround(
            planner!.surround(
                planner!.passThrough(findNode.integerLiteral('0')),
                prefix: [AtomicEdit.insert('throw ')],
                allowCascade: true),
            prefix: [AtomicEdit.insert('true ? ')],
            suffix: [AtomicEdit.insert(' : 2')]),
        'f(a) => a..b = true ? throw 0 : 2;');
  }

  Future<void> test_surround_precedence() async {
    await analyze('var x = 1 == true;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.integerLiteral('1')),
            suffix: [AtomicEdit.insert(' < 2')],
            outerPrecedence: Precedence.relational),
        'var x = 1 < 2 == true;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.integerLiteral('1')),
            suffix: [AtomicEdit.insert(' == 2')],
            outerPrecedence: Precedence.equality),
        'var x = (1 == 2) == true;');
  }

  Future<void> test_surround_prefix() async {
    await analyze('var x = 1;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.integerLiteral('1')),
            prefix: [AtomicEdit.insert('throw ')]),
        'var x = throw 1;');
  }

  Future<void> test_surround_suffix() async {
    await analyze('var x = 1;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.integerLiteral('1')),
            suffix: [AtomicEdit.insert('..isEven')]),
        'var x = 1..isEven;');
  }

  Future<void> test_surround_suffix_parenthesized() async {
    await analyze('var x = (1);');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.integerLiteral('1')),
            suffix: [AtomicEdit.insert('..isEven')]),
        'var x = 1..isEven;');
  }

  Future<void> test_surround_suffix_parenthesized_passThrough_unit() async {
    await analyze('var x = (1);');
    checkPlan(
        planner!.passThrough(testUnit, innerPlans: [
          planner!.surround(planner!.passThrough(findNode.integerLiteral('1')),
              suffix: [AtomicEdit.insert('..isEven')])
        ]),
        'var x = 1..isEven;');
  }

  Future<void> test_surround_threshold() async {
    await analyze('var x = 1 < 2;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.binary('<')),
            suffix: [AtomicEdit.insert(' == true')],
            innerPrecedence: Precedence.equality),
        'var x = 1 < 2 == true;');
    checkPlan(
        planner!.surround(planner!.passThrough(findNode.binary('<')),
            suffix: [AtomicEdit.insert(' as bool')],
            innerPrecedence: Precedence.relational),
        'var x = (1 < 2) as bool;');
  }
}

@reflectiveTest
class EndsInCascadeTest extends AbstractSingleUnitTest {
  Future<void> test_ignore_subexpression_not_at_end() async {
    await resolveTestUnit('f(g) => g(0..isEven, 1);');
    expect(findNode.functionExpressionInvocation('g(').endsInCascade, false);
    expect(findNode.cascade('..').endsInCascade, true);
  }

  Future<void> test_no_cascade() async {
    await resolveTestUnit('var x = 0;');
    expect(findNode.integerLiteral('0').endsInCascade, false);
  }

  Future<void> test_stop_searching_when_parens_encountered() async {
    await resolveTestUnit('f(x) => x = (x = 0..isEven);');
    expect(findNode.assignment('= (x').endsInCascade, false);
    expect(findNode.parenthesized('(x =').endsInCascade, false);
    expect(findNode.assignment('= 0').endsInCascade, true);
    expect(findNode.cascade('..').endsInCascade, true);
  }
}

/// Tests of the precedence logic underlying [EditPlan].
///
/// The way these tests operate is as follows: we have several short snippets of
/// Dart code exercising Dart syntax with no unnecessary parentheses.  We
/// recursively visit the AST of each snippet and use [EditPlanner.passThrough]
/// to create an edit plan based on each AST node.  Then we use
/// [EditPlanner.parensNeededFromContext] to check whether parentheses are
/// needed around each node, and assert that the result agrees with the set of
/// parentheses that are actually present.
@reflectiveTest
class PrecedenceTest extends AbstractSingleUnitTest {
  Future<void> checkPrecedence(String content) async {
    await resolveTestUnit(content);
    testUnit!.accept(_PrecedenceChecker(testUnit!.lineInfo, testCode));
  }

  Future<void> test_precedence_as() async {
    await checkPrecedence('''
f(a) => (a as num) as int;
g(a, b) => a | b as int;
''');
  }

  Future<void> test_precedence_assignment() async {
    await checkPrecedence('f(a, b, c) => a = b = c;');
  }

  Future<void> test_precedence_assignment_in_cascade_with_parens() async {
    await checkPrecedence('f(a, c, e) => a..b = (c..d = e);');
  }

  Future<void> test_precedence_await() async {
    await checkPrecedence('''
f(a) async => await -a;
g(a, b) async => await (a*b);
    ''');
  }

  Future<void> test_precedence_binary_equality() async {
    await checkPrecedence('''
f(a, b, c) => (a == b) == c;
g(a, b, c) => a == (b == c);
''');
  }

  Future<void> test_precedence_binary_left_associative() async {
    // Associativity logic is the same for all operators except relational and
    // equality, so we just test `+` as a stand-in for all the others.
    await checkPrecedence('''
f(a, b, c) => a + b + c;
g(a, b, c) => a + (b + c);
''');
  }

  Future<void> test_precedence_binary_relational() async {
    await checkPrecedence('''
f(a, b, c) => (a < b) < c;
g(a, b, c) => a < (b < c);
''');
  }

  Future<void> test_precedence_conditional() async {
    await checkPrecedence('''
g(a, b, c, d, e, f) => a ?? b ? c = d : e = f;
h(a, b, c, d, e) => (a ? b : c) ? d : e;
''');
  }

  Future<void> test_precedence_extension_override() async {
    await checkPrecedence('''
extension E on Object {
  void f() {}
}
void g(x) => E(x).f();
''');
  }

  Future<void> test_precedence_functionExpression_ifNotNull() async {
    await checkPrecedence('f(b, c) => ((a) => b) ?? c;');
  }

  Future<void> test_precedence_functionExpressionInvocation() async {
    await checkPrecedence('''
f(g) => g[0](1);
h(x) => (x + 2)(3);
''');
  }

  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/40536')
  Future<void> test_precedence_ifNotNull_functionExpression() async {
    await checkPrecedence('f(a, c) => a ?? (b) => c;');
  }

  Future<void> test_precedence_is() async {
    await checkPrecedence('''
f(a) => (a as num) is int;
g(a, b) => a | b is int;
''');
  }

  Future<void> test_precedence_postfix_and_index() async {
    await checkPrecedence('''
f(a, b, c) => a[b][c];
g(a, b) => a[b]++;
h(a, b) => (-a)[b];
''');
  }

  Future<void> test_precedence_prefix() async {
    await checkPrecedence('''
f(a) => ~-a;
g(a, b) => -(a*b);
''');
  }

  Future<void> test_precedence_prefixedIdentifier() async {
    await checkPrecedence('f(a) => a.b;');
  }

  Future<void> test_precedence_propertyAccess() async {
    await checkPrecedence('''
f(a) => a?.b?.c;
g(a) => (-a)?.b;
''');
  }

  Future<void> test_precedence_throw() async {
    await checkPrecedence('''
f(a, b) => throw a = b;
g(a, c) => a..b = throw (c..d);
''');
  }

  Future<void> test_precedenceChecker_detects_unnecessary_paren() async {
    await resolveTestUnit('var x = (1);');
    expect(
        () =>
            testUnit!.accept(_PrecedenceChecker(testUnit!.lineInfo, testCode)),
        throwsA(TypeMatcher<TestFailure>()));
  }
}

class _MockInfo implements AtomicEditInfo {
  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}

class _PrecedenceChecker extends UnifyingAstVisitor<void> {
  final EditPlanner planner;

  _PrecedenceChecker(LineInfo? lineInfo, String? sourceText)
      : planner = EditPlanner(lineInfo, sourceText);

  @override
  void visitNode(AstNode node) {
    expect(planner.passThrough(node).parensNeededFromContext(null), false);
    node.visitChildren(this);
  }

  @override
  void visitParenthesizedExpression(ParenthesizedExpression node) {
    expect(planner.passThrough(node).parensNeededFromContext(null), true);
    node.expression.visitChildren(this);
  }
}
