// 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.

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 = const 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 = const 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);
}
