// Copyright (c) 2012, 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;

/**
 * Runtime representation of a type.
 *
 * Type objects represent types.
 * A type object can be created in several ways:
 * * By a *type literal*, a type name occurring as an expression,
 *   like `Type type = int;`,
 *   or a type variable occurring as an expression, like `Type type = T;`.
 * * By reading the run-time type of an object,
 *   like `Type type = o.runtimeType;`.
 * * Through `dart:mirrors`.
 *
 * A type object is intended as an entry point for using `dart:mirrors`.
 * The only operations supported are comparing to other type objects
 * for equality, and converting it to a string for debugging.
 */
abstract class Type {
  /**
   * A hash code for the type which is compatible with [operator==].
   */
  int get hashCode;

  /**
   * Whether [other] is a [Type] instance representing an equivalent type.
   *
   * The language specification dictates which types are considered
   * to be the equivalent.
   * If two types are equivalent, it's guaranteed that they are subtypes
   * of each other,
   * but there are also types which are subtypes of each other,
   * and which are not equivalent (for example `dynamic` and `void`,
   * or `FutureOr<Object>` and `Object`).
   */
  bool operator ==(Object other);

  /**
   * Returns a string which represents the underlying type.
   *
   * The string is only intended for providing information to a reader
   * while debugging.
   * There is no guaranteed format,
   * the string value returned for a [Type] instances is entirely
   * implementation dependent.
   *
   * The string should be consistent, so a `Type` object for the *same* type
   * returns the same string throughout a program execution.
   * The string may or may not contain parts corresponding to the
   * source name of declaration of the type, if the type has a source name
   * at all (some types reachable through `dart:mirrors` may not).
   */
  String toString();
}
