Class UnionType

  • All Implemented Interfaces:
    java.io.Serializable

    public class UnionType
    extends JSType
    A type that may be any one of a set of types, and thus has the intersection of the properties of those types.

    The UnionType implements a common JavaScript idiom in which the code is specifically designed to work with multiple input types. Because JavaScript always knows the run-time type of an object value, this is safer than a C union.

    For instance, values of the union type (String,boolean) can be of type String or of type boolean. The commutativity of the statement is captured by making (String,boolean) and (boolean,String) equal.

    The implementation of this class prevents the creation of nested unions.

    See Also:
    Serialized Form
    • Method Detail

      • getAlternates

        public com.google.common.collect.ImmutableList<JSType> getAlternates()
        Gets the alternate types of this union type.
        Returns:
        The alternate types of this union type. The returned set is immutable.
      • matchesNumberContext

        public boolean matchesNumberContext()
        This predicate is used to test whether a given type can appear in a numeric context, such as an operand of a multiply operator.
        Overrides:
        matchesNumberContext in class JSType
        Returns:
        true if the type can appear in a numeric context.
      • matchesStringContext

        public boolean matchesStringContext()
        This predicate is used to test whether a given type can appear in a String context, such as an operand of a string concat (+) operator.

        All types have at least the potential for converting to String. When we add externally defined types, such as a browser OM, we may choose to add types that do not automatically convert to String.

        Overrides:
        matchesStringContext in class JSType
        Returns:
        true if not VoidType
      • matchesSymbolContext

        public boolean matchesSymbolContext()
        This predicate is used to test whether a given type can appear in a Symbol context
        Overrides:
        matchesSymbolContext in class JSType
        Returns:
        true if not it maybe a symbol or Symbol object
      • matchesObjectContext

        public boolean matchesObjectContext()
        This predicate is used to test whether a given type can appear in an Object context, such as the expression in a with statement.

        Most types we will encounter, except notably null, have at least the potential for converting to Object. Host defined objects can get peculiar.

        VOID type is included here because while it is not part of the JavaScript language, functions returning 'void' type can't be used as operands of any operator or statement.

        Overrides:
        matchesObjectContext in class JSType
        Returns:
        true if the type is not NullType or VoidType
      • findPropertyTypeWithoutConsideringTemplateTypes

        protected JSType findPropertyTypeWithoutConsideringTemplateTypes​(java.lang.String propertyName)
        Description copied from class: JSType
        Looks up a property on this type, but without properly replacing any templates in the result.

        Subclasses can override this if they need more complicated logic for property lookup than just autoboxing to an object.

        This is only for use by findPropertyType(JSType). Call that method instead if you need to lookup a property on a random JSType

        Overrides:
        findPropertyTypeWithoutConsideringTemplateTypes in class JSType
      • canBeCalled

        public boolean canBeCalled()
        Description copied from class: JSType
        This predicate is used to test whether a given type can be used as the 'function' in a function call.
        Overrides:
        canBeCalled in class JSType
        Returns:
        true if this type might be callable.
      • autobox

        public JSType autobox()
        Description copied from class: JSType
        Dereferences a type for property access. Filters null/undefined and autoboxes the resulting type. Never returns null.
        Overrides:
        autobox in class JSType
      • restrictByNotNullOrUndefined

        public JSType restrictByNotNullOrUndefined()
        Description copied from class: JSType
        If this is a union type, returns a union type that does not include the null or undefined type.
        Overrides:
        restrictByNotNullOrUndefined in class JSType
      • restrictByNotUndefined

        public JSType restrictByNotUndefined()
        Description copied from class: JSType
        If this is a union type, returns a union type that does not include the undefined type.
        Overrides:
        restrictByNotUndefined in class JSType
      • restrictByNotNull

        public JSType restrictByNotNull()
        Description copied from class: JSType
        If this is a union type, returns a union type that does not include the null type.
        Overrides:
        restrictByNotNull in class JSType
      • testForEquality

        public TernaryValue testForEquality​(JSType that)
        Description copied from class: JSType
        Compares this and that.
        Overrides:
        testForEquality in class JSType
        Returns:
        • TernaryValue.TRUE if the comparison of values of this type and that always succeed (such as undefined compared to null)
        • TernaryValue.FALSE if the comparison of values of this type and that always fails (such as undefined compared to number)
        • TernaryValue.UNKNOWN if the comparison can succeed or fail depending on the concrete values
      • isNullable

        public boolean isNullable()
        This predicate determines whether objects of this type can have the null value, and therefore can appear in contexts where null is expected.
        Overrides:
        isNullable in class JSType
        Returns:
        true for everything but Number and Boolean types.
      • isVoidable

        public boolean isVoidable()
        Tests whether this type is voidable.
        Overrides:
        isVoidable in class JSType
      • isExplicitlyVoidable

        public boolean isExplicitlyVoidable()
        Tests whether this type explicitly allows undefined (as opposed to ? or *).
        Overrides:
        isExplicitlyVoidable in class JSType
      • isStruct

        public boolean isStruct()
        Description copied from class: JSType
        Returns true iff this can be a struct. UnionType overrides the method, assume this is not a union here.
        Overrides:
        isStruct in class JSType
      • isDict

        public boolean isDict()
        Description copied from class: JSType
        Returns true iff this can be a dict. UnionType overrides the method, assume this is not a union here.
        Overrides:
        isDict in class JSType
      • getLeastSupertype

        public JSType getLeastSupertype​(JSType that)
        Description copied from class: JSType
        Gets the least supertype of this and that. The least supertype is the join (∨) or supremum of both types in the type lattice.

        Examples:

        • number ∨ * = *
        • number ∨ Object = (number, Object)
        • Number ∨ Object = Object
        Overrides:
        getLeastSupertype in class JSType
        Returns:
        this ∨ that
      • getPropertyKind

        public JSType.HasPropertyKind getPropertyKind​(java.lang.String pname,
                                                      boolean autobox)
        Description copied from class: JSType
        Checks whether the property is present on the object.
        Overrides:
        getPropertyKind in class JSType
        Parameters:
        pname - The property name.
        autobox - Whether to check for the presents on an autoboxed type
      • toMaybeUnionType

        public UnionType toMaybeUnionType()
        Description copied from class: JSType
        Downcasts this to a UnionType, or returns null if this is not a UnionType. Named in honor of Haskell's Maybe type constructor.
        Overrides:
        toMaybeUnionType in class JSType
      • isObject

        public boolean isObject()
        Description copied from class: JSType
        Tests whether this type is an Object, or any subtype thereof.
        Overrides:
        isObject in class JSType
        Returns:
        this <: Object
      • contains

        public boolean contains​(JSType type)
        A UnionType contains a given type (alternate) iff the member vector contains it.
        Parameters:
        type - The alternate which might be in this union.
        Returns:
        true if the alternate is in the union
      • getRestrictedUnion

        public JSType getRestrictedUnion​(JSType type)
        Returns a more restricted union type than this one, in which all subtypes of type have been removed.

        Examples:

        • (number,string) restricted by number is string
        • (null, EvalError, URIError) restricted by Error is null
        Parameters:
        type - the supertype of the types to remove from this union type
      • getRestrictedTypeGivenOutcome

        public JSType getRestrictedTypeGivenOutcome​(Outcome outcome)
        Description copied from class: JSType
        Computes the restricted type of this type knowing that the ToBoolean predicate has a specific value. For more information about the ToBoolean predicate, see JSType.getPossibleToBooleanOutcomes().
        Overrides:
        getRestrictedTypeGivenOutcome in class JSType
        Parameters:
        outcome - the value of the ToBoolean predicate
        Returns:
        the restricted type, or the Any Type if the underlying type could not have yielded this ToBoolean value TODO(user): Move this method to the SemanticRAI and use the visit method of types to get the restricted type.
      • getPossibleToBooleanOutcomes

        public BooleanLiteralSet getPossibleToBooleanOutcomes()
        Description copied from class: JSType
        Computes the set of possible outcomes of the ToBoolean predicate for this type. The ToBoolean predicate is defined by the ECMA-262 standard, 3rd edition. Its behavior for simple types can be summarized by the following table:
        ToBoolean results by input type
        typeresult
        undefined{false}
        null{false}
        boolean{true, false}
        number{true, false}
        string{true, false}
        Object{true}
        Specified by:
        getPossibleToBooleanOutcomes in class JSType
        Returns:
        the set of boolean literals for this type
      • getTypesUnderEquality

        public JSType.TypePair getTypesUnderEquality​(JSType that)
        Description copied from class: JSType
        Computes the subset of this and that types if equality is observed. If a value v1 of type null is equal to a value v2 of type (undefined,number), we can infer that the type of v1 is null and the type of v2 is undefined.
        Overrides:
        getTypesUnderEquality in class JSType
        Returns:
        a pair containing the restricted type of this as the first component and the restricted type of that as the second element. The returned pair is never null even though its components may be null
      • getTypesUnderInequality

        public JSType.TypePair getTypesUnderInequality​(JSType that)
        Description copied from class: JSType
        Computes the subset of this and that types if inequality is observed. If a value v1 of type number is not equal to a value v2 of type (undefined,number), we can infer that the type of v1 is number and the type of v2 is number as well.
        Overrides:
        getTypesUnderInequality in class JSType
        Returns:
        a pair containing the restricted type of this as the first component and the restricted type of that as the second element. The returned pair is never null even though its components may be null
      • getTypesUnderShallowInequality

        public JSType.TypePair getTypesUnderShallowInequality​(JSType that)
        Description copied from class: JSType
        Computes the subset of this and that types under shallow inequality.
        Overrides:
        getTypesUnderShallowInequality in class JSType
        Returns:
        A pair containing the restricted type of this as the first component and the restricted type of that as the second element. The returned pair is never null even though its components may be null
      • visit

        public <T> T visit​(Visitor<T> visitor)
        Description copied from class: JSType
        Visit this type with the given visitor.
        Specified by:
        visit in class JSType
        Returns:
        the value returned by the visitor
        See Also:
        Visitor
      • collapseUnion

        public JSType collapseUnion()
        Description copied from class: JSType
        Gets the least supertype of this that's not a union.
        Overrides:
        collapseUnion in class JSType
      • matchConstraint

        public void matchConstraint​(JSType constraint)
        Description copied from class: JSType
        Modify this type so that it matches the specified type. This is useful for reverse type-inference, where we want to infer that an object literal matches its constraint (much like how the java compiler does reverse-inference to figure out generics).
        Overrides:
        matchConstraint in class JSType
      • hasAnyTemplateTypesInternal

        public boolean hasAnyTemplateTypesInternal()