// 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:front_end/src/scanner/token.dart';

/// Opaque representation of Dart expression precedence.
///
/// [Expression] classes return an instance of this class to represent a
/// particular row in the Dart expression precedence table.  This allows clients
/// to determine when parentheses are needed (by comparing precedence values),
/// but ensures that the client does not become dependent on the particular
/// integers used by the analyzer to represent table rows, since we may need to
/// change these integers from time to time to accommodate new language
/// features.
class Precedence {
  static const Precedence none = Precedence._(NO_PRECEDENCE);

  static const Precedence assignment = Precedence._(ASSIGNMENT_PRECEDENCE);

  static const Precedence cascade = Precedence._(CASCADE_PRECEDENCE);

  static const Precedence conditional = Precedence._(CONDITIONAL_PRECEDENCE);

  static const Precedence ifNull = Precedence._(IF_NULL_PRECEDENCE);

  static const Precedence logicalOr = Precedence._(LOGICAL_OR_PRECEDENCE);

  static const Precedence logicalAnd = Precedence._(LOGICAL_AND_PRECEDENCE);

  static const Precedence equality = Precedence._(EQUALITY_PRECEDENCE);

  static const Precedence relational = Precedence._(RELATIONAL_PRECEDENCE);

  static const Precedence bitwiseOr = Precedence._(BITWISE_OR_PRECEDENCE);

  static const Precedence bitwiseXor = Precedence._(BITWISE_XOR_PRECEDENCE);

  static const Precedence bitwiseAnd = Precedence._(BITWISE_AND_PRECEDENCE);

  static const Precedence shift = Precedence._(SHIFT_PRECEDENCE);

  static const Precedence additive = Precedence._(ADDITIVE_PRECEDENCE);

  static const Precedence multiplicative =
      Precedence._(MULTIPLICATIVE_PRECEDENCE);

  static const Precedence prefix = Precedence._(PREFIX_PRECEDENCE);

  static const Precedence postfix = Precedence._(POSTFIX_PRECEDENCE);

  static const Precedence primary = Precedence._(SELECTOR_PRECEDENCE);

  final int _index;

  /// Constructs the precedence for a unary or binary expression constructed
  /// from an operator of the given [type].
  Precedence.forTokenType(TokenType type) : this._(type.precedence);

  const Precedence._(this._index);

  int get hashCode => _index.hashCode;

  /// Returns `true` if this precedence represents a looser binding than
  /// [other]; that is, parsing ambiguities will be resolved in favor of
  /// nesting the expression having precedence [other] within the expression
  /// having precedence `this`.
  bool operator <(Precedence other) => _index < other._index;

  /// Returns `true` if this precedence represents a looser, or equal, binding
  /// than [other]; that is, parsing ambiguities will be resolved in favor of
  /// nesting the expression having precedence [other] within the expression
  /// having precedence `this`, or, if the precedences are equal, parsing
  /// ambiguities will be resolved according to the associativity of the
  /// expression precedence.
  bool operator <=(Precedence other) => _index <= other._index;

  @override
  bool operator ==(Object other) =>
      other is Precedence && _index == other._index;

  /// Returns `true` if this precedence represents a tighter binding than
  /// [other]; that is, parsing ambiguities will be resolved in favor of
  /// nesting the expression having precedence `this` within the expression
  /// having precedence [other].
  bool operator >(Precedence other) => _index > other._index;

  /// Returns `true` if this precedence represents a tighter, or equal, binding
  /// than [other]; that is, parsing ambiguities will be resolved in favor of
  /// nesting the expression having precedence `this` within the expression
  /// having precedence [other], or, if the precedences are equal, parsing
  /// ambiguities will be resolved according to the associativity of the
  /// expression precedence.
  bool operator >=(Precedence other) => _index >= other._index;
}
