|  | // 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 = 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. | 
|  | /// | 
|  | /// Symbols created from equal [name] strings are themselves equal. | 
|  | /// If the symbols are created using `const`, symbols with the | 
|  | /// same [name] strings are canonicalized and identical. | 
|  | /// | 
|  | /// Some [name] strings create symbols which can also be created using | 
|  | /// a symbol literal, or be implicitly created while running Dart programs, | 
|  | /// for example through [Object.noSuchMethod]. | 
|  | /// | 
|  | /// If [name] is a single Dart identifier | 
|  | /// that does not start with an underscore, | 
|  | /// or it is a qualified identifier (multiple identifiers separated by `.`s), | 
|  | /// or it is the name of a user definable operator different from `unary-` | 
|  | /// (one of "`+`", "`-`", "`*`", "`/`", "`%`", "`~/`", "`&`", "`|`", | 
|  | ///   "`^`", "`~`", "`<<`", "`>>`", "`>>>`", "`<`", "`<=`", "`>`", "`>=`", | 
|  | ///   "`==`", "`[]`", or "`[]=`"), | 
|  | /// then the result of `Symbol(name)` is equal to the symbol literal | 
|  | /// created by prefixing `#` to the contents of [name], | 
|  | /// and `const Symbol(name)` is identical to that symbol literal. | 
|  | /// That is `#foo == Symbol("foo")` and | 
|  | /// `identical(#foo, const Symbol("foo"))`. | 
|  | /// | 
|  | /// If [name] is a single identifier that does not start with an underscore | 
|  | /// followed by a `=`, then the symbol is a setter name, and can be equal | 
|  | /// to the [Invocation.memberName] in an [Object.noSuchMethod] invocation. | 
|  | /// | 
|  | /// Private symbol literals, like `#_foo`, cannot be created using the | 
|  | /// symbol constructor. | 
|  | /// A symbol like `const Symbol("_foo")` is not equal to any symbol literal, | 
|  | /// or to any source name symbol introduced by `noSuchMethod`. | 
|  | /// | 
|  | /// ```dart | 
|  | /// assert(Symbol("foo") == Symbol("foo")); | 
|  | /// assert(Symbol("foo") == #foo); | 
|  | /// assert(identical(const Symbol("foo"), const Symbol("foo"))); | 
|  | /// assert(identical(const Symbol("foo"), #foo)); | 
|  | /// assert(Symbol("[]=") == #[]=); | 
|  | /// assert(identical(const Symbol("[]="), #[]=)); | 
|  | /// assert(Symbol("foo.bar") == #foo.bar); | 
|  | /// assert(identical(const Symbol("foo.bar"), #foo.bar)); | 
|  | /// ``` | 
|  | /// | 
|  | /// The created instance overrides [Object.==]. | 
|  | 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 with an equal (`==`) name string. | 
|  | /// | 
|  | /// Symbols representing library private names also need to represent | 
|  | /// names from the same library. | 
|  | bool operator ==(Object other); | 
|  | } |