// This code was auto-generated, is not intended to be edited, and is subject to
// significant change. Please see the README file for more information.
library engine.utilities.dart;
/**
 * The enumeration {@code ParameterKind} defines the different kinds of parameters. There are two
 * basic kinds of parameters: required and optional. Optional parameters are further divided into
 * two kinds: positional optional and named optional.
 * @coverage dart.engine.utilities
 */
class ParameterKind implements Comparable<ParameterKind> {
  static final ParameterKind REQUIRED = new ParameterKind('REQUIRED', 0, false);
  static final ParameterKind POSITIONAL = new ParameterKind('POSITIONAL', 1, true);
  static final ParameterKind NAMED = new ParameterKind('NAMED', 2, true);
  static final List<ParameterKind> values = [REQUIRED, POSITIONAL, NAMED];

  /// The name of this enum constant, as declared in the enum declaration.
  final String name;

  /// The position in the enum declaration.
  final int ordinal;

  /**
   * A flag indicating whether this is an optional parameter.
   */
  bool _isOptional2 = false;

  /**
   * Initialize a newly created kind with the given state.
   * @param isOptional {@code true} if this is an optional parameter
   */
  ParameterKind(this.name, this.ordinal, bool isOptional) {
    this._isOptional2 = isOptional;
  }

  /**
   * Return {@code true} if this is an optional parameter.
   * @return {@code true} if this is an optional parameter
   */
  bool isOptional() => _isOptional2;
  int compareTo(ParameterKind other) => ordinal - other.ordinal;
  String toString() => name;
}