// 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_plugin/protocol/protocol_common.dart';
import 'package:nnbd_migration/src/nullability_node.dart';
import 'package:nnbd_migration/src/potential_modification.dart';

/// Container for information gathered during nullability migration about the
/// set of runtime checks that might need to be performed on the value of an
/// expression.
///
/// TODO(paulberry): the only check we support now is [nullCheck], which checks
/// that the expression is not null.  We need to add other checks, e.g. to check
/// that a List<int?> is actually a List<int>.
class ExpressionChecks extends PotentialModification {
  /// Source offset where a trailing `!` might need to be inserted.
  final int offset;

  /// Nullability node indicating whether the expression's value is nullable.
  final NullabilityNode valueNode;

  /// Nullability node indicating whether the expression's context requires a
  /// nullable value.
  final NullabilityNode contextNode;

  /// Nullability nodes guarding execution of the expression.  If any of the
  /// nodes in this list turns out to be non-nullable, the expression is dead
  /// code and will be removed by the migration tool.
  final List<NullabilityNode> guards;

  ExpressionChecks(this.offset, this.valueNode, this.contextNode,
      Iterable<NullabilityNode> guards)
      : guards = guards.toList();

  @override
  bool get isEmpty {
    for (var guard in guards) {
      if (!guard.isNullable) return true;
    }
    return !valueNode.isNullable || contextNode.isNullable;
  }

  @override
  Iterable<SourceEdit> get modifications =>
      isEmpty ? [] : [SourceEdit(offset, 0, '!')];
}
