// 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/unit_propagation.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 {
  /// Constraint variable whose value will be `true` if the code path that
  /// results from the condition evaluating to `true` will be reachable after
  /// nullability migration, and therefore should be kept.
  final ConstraintVariable keepTrue;

  /// Constraint variable whose value will be `false` if the code path that
  /// results from the condition evaluating to `false` will be reachable after
  /// nullability migration, and therefore should be kept.
  final ConstraintVariable keepFalse;

  /// 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 [keepTrue] or [keepFalse] 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.keepTrue, this.keepFalse, this.pureCondition);
}
