// 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:analysis_server/src/nullability/nullability_node.dart';

/// Container for information gathered during nullability migration about a
/// conditional check that might need to be discarded.
///
/// This information will be associated with an Expression in the input program
/// whose boolean value influences control flow (e.g. the condition of an `if`
/// statement).
class ConditionalDiscard {
  /// Nullability node that will be `nullable` if the code path that results
  /// from the condition evaluating to `true` will be reachable after
  /// nullability migration, and therefore should be kept.
  ///
  /// `null` if the code path should be kept regardless of the outcome of
  /// migration.
  final NullabilityNode trueGuard;

  /// Nullability node that will be `nullable` if the code path that results
  /// from the condition evaluating to `false` will be reachable after
  /// nullability migration, and therefore should be kept.
  ///
  /// `null` if the code path should be kept regardless of the outcome of
  /// migration.
  final NullabilityNode falseGuard;

  /// Indicates whether the condition is pure (free from side effects).
  ///
  /// For example, a condition like `x == null` is pure (assuming `x` is a local
  /// variable or static variable), because evaluating it has no user-visible
  /// effect other than returning a boolean value.
  ///
  /// If [pureCondition] is `false`, and either [trueGuard] or [falseGuard] is
  /// `false`, that it is safe to delete the condition expression as well as the
  /// dead code branch (e.g. it means that `if (x == null) f(); else g();` could
  /// be changed to simply `g();`).
  final bool pureCondition;

  ConditionalDiscard(this.trueGuard, this.falseGuard, this.pureCondition);

  /// Indicates whether the code path that results from the condition evaluating
  /// to `false` is reachable after migration.
  bool get keepFalse => falseGuard == null || falseGuard.isNullable;

  /// Indicates whether the code path that results from the condition evaluating
  /// to `true` is reachable after migration.
  bool get keepTrue => trueGuard == null || trueGuard.isNullable;
}
