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

library dart2js.abstract_value_domain;

import '../constants/values.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
import '../native/native.dart' show
    NativeBehavior;
import '../universe/selector.dart' show
    Selector;
import '../universe/universe.dart' show
    ReceiverConstraint;

enum AbstractBool {
  True, False, Maybe, Nothing
}

/// A value in an abstraction of runtime values.
abstract class AbstractValue {}

/// A system that implements an abstraction over runtime values and provides
/// access to interprocedural analysis results.
// TODO(johnniwinther): Consider extracting the inference result access from
// this interface.
abstract class AbstractValueDomain {
  AbstractValue get dynamicType;
  AbstractValue get typeType;
  AbstractValue get functionType;
  AbstractValue get boolType;
  AbstractValue get intType;
  AbstractValue get doubleType;
  AbstractValue get numType;
  AbstractValue get stringType;
  AbstractValue get listType;
  AbstractValue get mapType;
  AbstractValue get nonNullType;
  AbstractValue get nullType;
  AbstractValue get extendableArrayType;
  AbstractValue get fixedArrayType;
  AbstractValue get arrayType;
  AbstractValue get uint31Type;
  AbstractValue get uint32Type;
  AbstractValue get uintType;

  AbstractValue get numStringBoolType;

  AbstractValue get fixedLengthType;

  AbstractValue get interceptorType;

  AbstractValue get interceptedTypes;

  bool methodUsesReceiverArgument(FunctionElement function);

  Element locateSingleElement(AbstractValue mask, Selector selector);

  ClassElement singleClass(AbstractValue mask);

  bool needsNoSuchMethodHandling(AbstractValue mask, Selector selector);

  AbstractValue getReceiverType(MethodElement method);

  AbstractValue getParameterType(ParameterElement parameter);

  AbstractValue getReturnType(FunctionElement function);

  AbstractValue getInvokeReturnType(Selector selector, AbstractValue mask);

  AbstractValue getFieldType(FieldElement field);

  AbstractValue join(AbstractValue a, AbstractValue b);

  AbstractValue intersection(AbstractValue a, AbstractValue b);

  AbstractValue getTypeOf(ConstantValue constant);

  /// Returns the constant value if the [AbstractValue] represents a single
  /// constant value. Returns `null` if [value] is not a constant.
  ConstantValue getConstantOf(AbstractValue value);

  AbstractValue nonNullExact(ClassElement element);

  AbstractValue nonNullSubclass(ClassElement element);

  AbstractValue nonNullSubtype(ClassElement element);

  bool isDefinitelyBool(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyNum(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyString(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyNumStringBool(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyNotNumStringBool(AbstractValue t);

  /// True if all values of [t] are either integers or not numbers at all.
  ///
  /// This does not imply that the value is an integer, since most other values
  /// such as null are also not a non-integer double.
  bool isDefinitelyNotNonIntegerDouble(AbstractValue t);

  bool isDefinitelyNonNegativeInt(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyInt(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyUint31(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyUint32(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyUint(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyArray(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyMutableArray(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyFixedArray(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyExtendableArray(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyIndexable(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyMutableIndexable(AbstractValue t, {bool allowNull: false});

  bool isDefinitelyFixedLengthIndexable(AbstractValue t,
                                        {bool allowNull: false});

  bool isDefinitelyIntercepted(AbstractValue t, {bool allowNull});

  /// Given a class from the interceptor hierarchy, returns an [AbstractValue]
  /// matching all values with that interceptor (or a subtype thereof).
  AbstractValue getInterceptorSubtypes(ClassElement class_);

  bool areDisjoint(AbstractValue leftType, AbstractValue rightType);

  bool isMorePreciseOrEqual(AbstractValue t1, AbstractValue t2);

  AbstractBool isSubtypeOf(AbstractValue value,
                           DartType type,
                           {bool allowNull});

  /// Returns whether [value] is one of the falsy values: false, 0, -0, NaN,
  /// the empty string, or null.
  AbstractBool boolify(AbstractValue value);

  AbstractBool strictBoolify(AbstractValue type);

  /// Create a type mask containing at least all subtypes of [type].
  AbstractValue subtypesOf(DartType type);

  /// Returns a subset of [receiver] containing at least the types
  /// that can respond to [selector] without throwing.
  AbstractValue receiverTypeFor(Selector selector, AbstractValue receiver);

  /// The result of an index operation on [value], or the dynamic type if
  /// unknown.
  AbstractValue elementTypeOfIndexable(AbstractValue value);

  /// The length property of [value], or `null` if unknown.
  int getContainerLength(AbstractValue value);

  /// Returns the type of the entry of [container] at a given index.
  /// Returns `null` if unknown.
  AbstractValue indexWithConstant(AbstractValue container,
                                  ConstantValue indexValue);
}
