Class UnionType
- java.lang.Object
-
- com.google.javascript.rhino.jstype.JSType
-
- com.google.javascript.rhino.jstype.UnionType
-
- All Implemented Interfaces:
java.io.Serializable
public class UnionType extends JSType
TheUnionType
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 typeString
or of typeboolean
. 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
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class com.google.javascript.rhino.jstype.JSType
JSType.TypePair
-
-
Field Summary
-
Fields inherited from class com.google.javascript.rhino.jstype.JSType
EMPTY_TYPE_COMPONENT, ENUMDECL, NOT_A_CLASS, NOT_A_TYPE, NOT_ENUMDECL, templateTypeMap, UNKNOWN_NAME
-
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description JSType
autobox()
Dereference a type for property access.boolean
canBeCalled()
This predicate is used to test whether a given type can be used as the 'function' in a function call.JSType
collapseUnion()
Gets the least supertype of this that's not a union.boolean
contains(JSType type)
AUnionType
contains a given type (alternate) iff the member vector contains it.JSType
findPropertyType(java.lang.String propertyName)
Coerces this type to an Object type, then gets the type of the property whose name is given.java.util.Collection<JSType>
getAlternates()
Gets the alternate types of this union type.JSType
getLeastSupertype(JSType that)
Gets the least supertype ofthis
andthat
.BooleanLiteralSet
getPossibleToBooleanOutcomes()
Computes the set of possible outcomes of theToBoolean
predicate for this type.JSType
getRestrictedTypeGivenToBooleanOutcome(boolean outcome)
Computes the restricted type of this type knowing that theToBoolean
predicate has a specific value.JSType
getRestrictedUnion(JSType type)
Returns a more restricted union type thanthis
one, in which all subtypes oftype
have been removed.JSType.TypePair
getTypesUnderEquality(JSType that)
Computes the subset ofthis
andthat
types if equality is observed.JSType.TypePair
getTypesUnderInequality(JSType that)
Computes the subset ofthis
andthat
types if inequality is observed.JSType.TypePair
getTypesUnderShallowInequality(JSType that)
Computes the subset ofthis
andthat
types under shallow inequality.boolean
hasAnyTemplateTypesInternal()
int
hashCode()
boolean
hasProperty(java.lang.String pname)
Checks whether the property is present on the object.boolean
isDict()
Returns true iffthis
can be adict
.boolean
isNullable()
This predicate determines whether objects of this type can have thenull
value, and therefore can appear in contexts wherenull
is expected.boolean
isObject()
Tests whether this type is anObject
, or any subtype thereof.boolean
isStruct()
Returns true iffthis
can be astruct
.boolean
isSubtype(JSType that)
Checks whetherthis
is a subtype ofthat
.boolean
isUnknownType()
void
matchConstraint(JSType constraint)
Modify this type so that it matches the specified type.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.boolean
matchesObjectContext()
This predicate is used to test whether a given type can appear in anObject
context, such as the expression in awith
statement.boolean
matchesStringContext()
This predicate is used to test whether a given type can appear in aString
context, such as an operand of a string concat (+
) operator.JSType
restrictByNotNullOrUndefined()
If this is a union type, returns a union type that does not include the null or undefined type.boolean
setValidator(com.google.common.base.Predicate<JSType> validator)
Certain types have constraints on them at resolution-time.TernaryValue
testForEquality(JSType that)
Comparesthis
andthat
.java.lang.String
toDebugHashCodeString()
A hash code function for diagnosing complicated issues around type-identity.UnionType
toMaybeUnionType()
Downcasts this to a UnionType, or returns null if this is not a UnionType.<T> T
visit(Visitor<T> visitor)
Visit this type with the given visitor.-
Methods inherited from class com.google.javascript.rhino.jstype.JSType
autoboxesTo, canCastTo, canTestForEqualityWith, canTestForShallowEqualityWith, clearResolved, dereference, differsFrom, equals, forceResolve, getDisplayName, getGreatestSubtype, getJSDocInfo, getTemplateTypeMap, getTypesUnderShallowEquality, hasAnyTemplateTypes, hasDisplayName, isAllType, isArrayType, isBooleanObjectType, isBooleanValueType, isCheckedUnknownType, isConstructor, isDateType, isEmptyType, isEnumElementType, isEnumType, isEquivalent, isEquivalentTo, isFunctionPrototypeType, isFunctionType, isGlobalThisType, isInstanceType, isInterface, isInvariant, isNominalConstructor, isNominalType, isNoObjectType, isNoResolvedType, isNoType, isNullType, isNumber, isNumberObjectType, isNumberValueType, isOrdinaryFunction, isRecordType, isRegexpType, isResolved, isString, isStringObjectType, isStringValueType, isTemplateType, isTemplatizedType, isUnionType, isVoidType, matchesInt32Context, matchesUint32Context, resolve, toAnnotationString, toMaybeEnumElementType, toMaybeEnumType, toMaybeFunctionType, toMaybeFunctionType, toMaybeTemplateType, toMaybeTemplateType, toMaybeTemplatizedType, toMaybeTemplatizedType, toObjectType, toString, unboxesTo
-
-
-
-
Method Detail
-
getAlternates
public java.util.Collection<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 classJSType
- 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 aString
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 toString
.- Overrides:
matchesStringContext
in classJSType
- Returns:
true
if notVoidType
-
matchesObjectContext
public boolean matchesObjectContext()
This predicate is used to test whether a given type can appear in anObject
context, such as the expression in awith
statement.Most types we will encounter, except notably
null
, have at least the potential for converting toObject
. 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 classJSType
- Returns:
true
if the type is notNullType
orVoidType
-
findPropertyType
public JSType findPropertyType(java.lang.String propertyName)
Description copied from class:JSType
Coerces this type to an Object type, then gets the type of the property whose name is given. UnlikeObjectType.getPropertyType(java.lang.String)
, returns null if the property is not found.- Overrides:
findPropertyType
in classJSType
- Returns:
- The property's type.
null
if the current type cannot have properties, or if the type is not found.
-
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 classJSType
- Returns:
true
if this type might be callable.
-
autobox
public JSType autobox()
Description copied from class:JSType
Dereference a type for property access. Filters null/undefined and autoboxes the resulting type. Never returns null.
-
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 classJSType
-
testForEquality
public TernaryValue testForEquality(JSType that)
Description copied from class:JSType
Comparesthis
andthat
.- Overrides:
testForEquality
in classJSType
- Returns:
TernaryValue.TRUE
if the comparison of values ofthis
type andthat
always succeed (such asundefined
compared tonull
)TernaryValue.FALSE
if the comparison of values ofthis
type andthat
always fails (such asundefined
compared tonumber
)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 thenull
value, and therefore can appear in contexts wherenull
is expected.- Overrides:
isNullable
in classJSType
- Returns:
true
for everything butNumber
andBoolean
types.
-
isUnknownType
public boolean isUnknownType()
- Overrides:
isUnknownType
in classJSType
-
isStruct
public boolean isStruct()
Description copied from class:JSType
Returns true iffthis
can be astruct
. UnionType overrides the method, assumethis
is not a union here.
-
isDict
public boolean isDict()
Description copied from class:JSType
Returns true iffthis
can be adict
. UnionType overrides the method, assumethis
is not a union here.
-
getLeastSupertype
public JSType getLeastSupertype(JSType that)
Description copied from class:JSType
Gets the least supertype ofthis
andthat
. 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 classJSType
- Returns:
this ∨ that
-
hasProperty
public boolean hasProperty(java.lang.String pname)
Description copied from class:JSType
Checks whether the property is present on the object.- Overrides:
hasProperty
in classJSType
- Parameters:
pname
- The property name.
-
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 classJSType
-
isObject
public boolean isObject()
Description copied from class:JSType
Tests whether this type is anObject
, or any subtype thereof.
-
contains
public boolean contains(JSType type)
AUnionType
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 thanthis
one, in which all subtypes oftype
have been removed.Examples:
(number,string)
restricted bynumber
isstring
(null, EvalError, URIError)
restricted byError
isnull
- Parameters:
type
- the supertype of the types to remove from this union type
-
isSubtype
public boolean isSubtype(JSType that)
Description copied from class:JSType
Checks whetherthis
is a subtype ofthat
.Subtyping rules:
- (unknown) — every type is a subtype of the Unknown type.
- (no) — the No type is a subtype of every type.
- (no-object) — the NoObject type is a subtype of every object type (i.e. subtypes of the Object type).
- (ref) — a type is a subtype of itself.
- (union-l) — A union type is a subtype of a type U if all the
union type's constituents are a subtype of U. Formally
(T<sub>1</sub>, …, T<sub>n</sub>) <: U
if and onlyT<sub>k</sub> <: U
for allk ∈ 1..n
. - (union-r) — A type U is a subtype of a union type if it is a
subtype of one of the union type's constituents. Formally
U <: (T<sub>1</sub>, …, T<sub>n</sub>)
if and only ifU <: T<sub>k</sub>
for some indexk
. - (objects) — an Object
O<sub>1</sub>
is a subtype of an objectO<sub>2</sub>
if it has more properties thanO<sub>2</sub>
and all common properties are pairwise subtypes.
-
getRestrictedTypeGivenToBooleanOutcome
public JSType getRestrictedTypeGivenToBooleanOutcome(boolean outcome)
Description copied from class:JSType
Computes the restricted type of this type knowing that theToBoolean
predicate has a specific value. For more information about theToBoolean
predicate, seeJSType.getPossibleToBooleanOutcomes()
.- Overrides:
getRestrictedTypeGivenToBooleanOutcome
in classJSType
- Parameters:
outcome
- the value of theToBoolean
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 theToBoolean
predicate for this type. TheToBoolean
predicate is defined by the ECMA-262 standard, 3rd edition. Its behavior for simple types can be summarized by the following table:type result undefined
{false} null
{false} boolean
{true, false} number
{true, false} string
{true, false} Object
{true} - Specified by:
getPossibleToBooleanOutcomes
in classJSType
- Returns:
- the set of boolean literals for this type
-
getTypesUnderEquality
public JSType.TypePair getTypesUnderEquality(JSType that)
Description copied from class:JSType
Computes the subset ofthis
andthat
types if equality is observed. If a valuev1
of typenull
is equal to a valuev2
of type(undefined,number)
, we can infer that the type ofv1
isnull
and the type ofv2
isundefined
.- Overrides:
getTypesUnderEquality
in classJSType
- Returns:
- a pair containing the restricted type of
this
as the first component and the restricted type ofthat
as the second element. The returned pair is nevernull
even though its components may benull
-
getTypesUnderInequality
public JSType.TypePair getTypesUnderInequality(JSType that)
Description copied from class:JSType
Computes the subset ofthis
andthat
types if inequality is observed. If a valuev1
of typenumber
is not equal to a valuev2
of type(undefined,number)
, we can infer that the type ofv1
isnumber
and the type ofv2
isnumber
as well.- Overrides:
getTypesUnderInequality
in classJSType
- Returns:
- a pair containing the restricted type of
this
as the first component and the restricted type ofthat
as the second element. The returned pair is nevernull
even though its components may benull
-
getTypesUnderShallowInequality
public JSType.TypePair getTypesUnderShallowInequality(JSType that)
Description copied from class:JSType
Computes the subset ofthis
andthat
types under shallow inequality.- Overrides:
getTypesUnderShallowInequality
in classJSType
- Returns:
- A pair containing the restricted type of
this
as the first component and the restricted type ofthat
as the second element. The returned pair is nevernull
even though its components may benull
-
visit
public <T> T visit(Visitor<T> visitor)
Description copied from class:JSType
Visit this type with the given visitor.
-
toDebugHashCodeString
public java.lang.String toDebugHashCodeString()
Description copied from class:JSType
A hash code function for diagnosing complicated issues around type-identity.- Overrides:
toDebugHashCodeString
in classJSType
-
setValidator
public boolean setValidator(com.google.common.base.Predicate<JSType> validator)
Description copied from class:JSType
Certain types have constraints on them at resolution-time. For example, a type in an@extends
annotation must be an object. Clients should inject a validator that emits a warning if the type does not validate, and return false.- Overrides:
setValidator
in classJSType
-
collapseUnion
public JSType collapseUnion()
Description copied from class:JSType
Gets the least supertype of this that's not a union.- Overrides:
collapseUnion
in classJSType
-
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 classJSType
-
hasAnyTemplateTypesInternal
public boolean hasAnyTemplateTypesInternal()
-
-