// 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:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analyzer/dart/ast/ast.dart';

/// Opaque representation of pattern precedence.
///
/// [DartPattern] classes return an instance of this class. This allows clients
/// to determine when parentheses are needed (by comparing precedence values).
class PatternPrecedence {
  static const PatternPrecedence logicalOr = PatternPrecedence._(1);
  static const PatternPrecedence logicalAnd = PatternPrecedence._(2);
  static const PatternPrecedence relational = PatternPrecedence._(3);
  static const PatternPrecedence postfix = PatternPrecedence._(4);
  static const PatternPrecedence primary = PatternPrecedence._(5);

  final int _index;

  const PatternPrecedence._(this._index);

  @override
  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 pattern having precedence [other] within the pattern
  /// having precedence `this`.
  bool operator <(PatternPrecedence 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 pattern having precedence [other] within the pattern
  /// having precedence `this`, or, if the precedences are equal, parsing
  /// ambiguities will be resolved according to the associativity of the
  /// pattern precedence.
  bool operator <=(PatternPrecedence other) => _index <= other._index;

  @override
  bool operator ==(Object other) =>
      other is PatternPrecedence && _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 pattern having precedence `this` within the pattern
  /// having precedence [other].
  bool operator >(PatternPrecedence 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 pattern having precedence `this` within the pattern
  /// having precedence [other], or, if the precedences are equal, parsing
  /// ambiguities will be resolved according to the associativity of the
  /// pattern precedence.
  bool operator >=(PatternPrecedence other) => _index >= other._index;
}

/// 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);

  @override
  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;
}
