// Copyright (c) 2013, 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.

// @dart = 2.5

part of dart.core;

/// Opaque name used by mirrors, invocations and [Function.apply].
abstract class Symbol {
  /** The symbol corresponding to the name of the unary minus operator. */
  static const Symbol unaryMinus = Symbol("unary-");

  /**
   * The empty symbol.
   *
   * The empty symbol is the name of libraries with no library declaration,
   * and the base-name of the unnamed constructor.
   */
  static const Symbol empty = Symbol("");

  /**
   * Constructs a new [Symbol] representing the provided name.
   *
   * The name must be a valid public Dart member name,
   * public constructor name, or library name, optionally qualified.
   *
   * A qualified name is a valid name preceded by a public identifier name
   * and a '`.`', e.g., `foo.bar.baz=` is a qualified version of `baz=`.
   * That means that the content of the [name] String must be either
   *
   * * a valid public Dart identifier
   *   (that is, an identifier not starting with "`_`"),
   * * such an identifier followed by "=" (a setter name),
   * * the name of a declarable operator
   *   (one of "`+`", "`-`", "`*`", "`/`", "`%`", "`~/`", "`&`", "`|`",
   *   "`^`", "`~`", "`<<`", "`>>`", "`<`", "`<=`", "`>`", "`>=`", "`==`",
   *   "`[]`", "`[]=`", or "`unary-`"),
   * * any of the above preceded by any number of qualifiers,
   *   where a qualifier is a non-private identifier followed by '`.`',
   * * or the empty string (the default name of a library with no library
   *   name declaration).
   *
   * Symbol instances created from the same [name] are equal,
   * but not necessarily identical, but symbols created as compile-time
   * constants are canonicalized, as all other constant object creations.
   *
   * ```dart
   * assert(new Symbol("foo") == new Symbol("foo"));
   * assert(identical(const Symbol("foo"), const Symbol("foo")));
   * ```
   *
   * If [name] is a single identifier that does not start with an underscore,
   * or it is a qualified identifier,
   * or it is an operator name different from `unary-`,
   * then the result of `const Symbol(name)` is the same instance that
   * the symbol literal created by prefixing `#` to the content of [name]
   * would evaluate to.
   *
   * ```dart
   * assert(new Symbol("foo") == #foo);
   * assert(new Symbol("[]=") == #[]=]);
   * assert(new Symbol("foo.bar") == #foo.bar);
   * assert(identical(const Symbol("foo"), #foo));
   * assert(identical(const Symbol("[]="), #[]=]));
   * assert(identical(const Symbol("foo.bar"), #foo.bar));
   * ```
   *
   * This constructor cannot create a [Symbol] instance that is equal to
   * a private symbol literal like `#_foo`.
   * ```dart
   * const Symbol("_foo") // Invalid
   * ```
   *
   * The created instance overrides [Object.==].
   *
   * The following text is non-normative:
   *
   * Creating non-const Symbol instances may result in larger output.  If
   * possible, use `MirrorsUsed` from "dart:mirrors" to specify which names
   * might be passed to this constructor.
   */
  const factory Symbol(String name) = internal.Symbol;

  /**
   * Returns a hash code compatible with [operator==].
   *
   * Equal symbols have the same hash code.
   */
  int get hashCode;

  /**
   * Symbols are equal to other symbols that correspond to the same member name.
   *
   * Qualified member names, like `#foo.bar` are equal only if they have the
   * same identifiers before the same final member name.
   */
  bool operator ==(other);
}
