public class UnionType extends JSType
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.
JSType.TypePair
templateTypeMap
Modifier and Type | Method and 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)
A
UnionType contains a given type (alternate) iff the member
vector contains it. |
JSType |
findPropertyType(String propertyName)
Coerces this type to an Object type, then gets the type of the property
whose name is given.
|
Collection<JSType> |
getAlternates()
Gets the alternate types of this union type.
|
Collection<JSType> |
getAlternatesWithoutStructuralTyping()
Gets the alternate types of this union type, including structural interfaces
and implicit implementations as are distinct alternates.
|
JSType |
getLeastSupertype(JSType that)
Gets the least supertype of
this and that . |
BooleanLiteralSet |
getPossibleToBooleanOutcomes()
Computes the set of possible outcomes of the
ToBoolean predicate
for this type. |
JSType |
getRestrictedTypeGivenToBooleanOutcome(boolean outcome)
Computes the restricted type of this type knowing that the
ToBoolean predicate has a specific value. |
JSType |
getRestrictedUnion(JSType type)
Returns a more restricted union type than
this one, in which all
subtypes of type have been removed. |
JSType.TypePair |
getTypesUnderEquality(JSType that)
Computes the subset of
this and that types if equality
is observed. |
JSType.TypePair |
getTypesUnderInequality(JSType that)
Computes the subset of
this and that types if inequality
is observed. |
JSType.TypePair |
getTypesUnderShallowInequality(JSType that)
Computes the subset of
this and that types under
shallow inequality. |
boolean |
hasAnyTemplateTypesInternal() |
int |
hashCode() |
boolean |
hasProperty(String pname)
Checks whether the property is present on the object.
|
boolean |
isDict()
Returns true iff
this can be a dict . |
boolean |
isExplicitlyVoidable()
Tests whether this type explicitly allows undefined.
|
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. |
boolean |
isObject()
Tests whether this type is an
Object , or any subtype thereof. |
boolean |
isStruct()
Returns true iff
this can be a struct . |
boolean |
isSubtype(JSType that)
Checks whether
this is a subtype of that . |
protected boolean |
isSubtype(JSType that,
com.google.javascript.rhino.jstype.JSType.ImplCache implicitImplCache)
checking isSubtype with structural interface matching
|
boolean |
isUnknownType() |
boolean |
isVoidable()
Tests whether this type is voidable.
|
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 an
Object context, such as the expression in a with
statement. |
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. |
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)
Compares
this and that . |
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.
|
autoboxesTo, canCastTo, canTestForEqualityWith, canTestForShallowEqualityWith, dereference, differsFrom, equals, extendTemplateTypeMap, getDisplayName, getGreatestSubtype, getJSDocInfo, getTemplateTypeMap, getTypesUnderShallowEquality, hasAnyTemplateTypes, hasDisplayName, isAllType, isArrayType, isBooleanObjectType, isBooleanValueType, isBottom, isCheckedUnknownType, isConstructor, isDateType, isEmptyType, isEnumElementType, isEnumType, isEquivalent, isEquivalentTo, isEquivalentTo, isFunctionPrototypeType, isFunctionType, isGlobalThisType, isInstanceType, isInterface, isNamedType, isNominalConstructor, isNominalType, isNoObjectType, isNoResolvedType, isNoType, isNullType, isNumber, isNumberObjectType, isNumberValueType, isOrdinaryFunction, isRecordType, isRegexpType, isResolved, isString, isStringObjectType, isStringValueType, isStructuralInterface, isStructuralType, isSubtypeOf, isSubtypeWithoutStructuralTyping, isTemplateType, isTemplatizedType, isUnionType, isVoidType, matchesInt32Context, matchesUint32Context, resolve, toAnnotationString, toMaybeEnumElementType, toMaybeEnumType, toMaybeFunctionType, toMaybeFunctionType, toMaybeNamedType, toMaybeObjectType, toMaybeRecordType, toMaybeTemplateType, toMaybeTemplatizedType, toNonNullAnnotationString, toObjectType, toString, unboxesTo
public Collection<JSType> getAlternates()
public Collection<JSType> getAlternatesWithoutStructuralTyping()
public boolean matchesNumberContext()
matchesNumberContext
in class JSType
public boolean matchesStringContext()
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
.
matchesStringContext
in class JSType
true
if not VoidType
public boolean matchesObjectContext()
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.
matchesObjectContext
in class JSType
true
if the type is not NullType
or
VoidType
public JSType findPropertyType(String propertyName)
JSType
ObjectType.getPropertyType(java.lang.String)
, returns null if the property
is not found.findPropertyType
in class JSType
null
if the current type cannot
have properties, or if the type is not found.public boolean canBeCalled()
JSType
canBeCalled
in class JSType
true
if this type might be callable.public JSType autobox()
JSType
public JSType restrictByNotNullOrUndefined()
JSType
restrictByNotNullOrUndefined
in interface TypeI
restrictByNotNullOrUndefined
in class JSType
public TernaryValue testForEquality(JSType that)
JSType
this
and that
.testForEquality
in class JSType
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 valuespublic boolean isNullable()
null
value, and therefore can appear in contexts where
null
is expected.isNullable
in class JSType
true
for everything but Number
and
Boolean
types.public boolean isVoidable()
isVoidable
in class JSType
public boolean isExplicitlyVoidable()
isExplicitlyVoidable
in class JSType
public boolean isUnknownType()
isUnknownType
in interface TypeI
isUnknownType
in class JSType
public boolean isStruct()
JSType
this
can be a struct
.
UnionType overrides the method, assume this
is not a union here.public boolean isDict()
JSType
this
can be a dict
.
UnionType overrides the method, assume this
is not a union here.public JSType getLeastSupertype(JSType that)
JSType
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
getLeastSupertype
in class JSType
this ∨ that
public boolean hasProperty(String pname)
JSType
hasProperty
in class JSType
pname
- The property name.public UnionType toMaybeUnionType()
JSType
toMaybeUnionType
in class JSType
public boolean isObject()
JSType
Object
, or any subtype thereof.public boolean contains(JSType type)
UnionType
contains a given type (alternate) iff the member
vector contains it.type
- The alternate which might be in this union.true
if the alternate is in the unionpublic JSType getRestrictedUnion(JSType type)
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
type
- the supertype of the types to remove from this union typepublic boolean isSubtype(JSType that)
JSType
this
is a subtype of that
.Note this function also returns true if this type structurally matches the protocol define by that type (if that type is an interface function type) Subtyping rules:
(T1, …, Tn) <: U
if and only
Tk <: U
for all k ∈ 1..n
.U <: (T1, …, Tn)
if and only
if U <: Tk
for some index k
.O1
is a subtype
of an object O2
if it has more properties
than O2
and all common properties are
pairwise subtypes.protected boolean isSubtype(JSType that, com.google.javascript.rhino.jstype.JSType.ImplCache implicitImplCache)
JSType
public JSType getRestrictedTypeGivenToBooleanOutcome(boolean outcome)
JSType
ToBoolean
predicate has a specific value. For more information
about the ToBoolean
predicate, see
JSType.getPossibleToBooleanOutcomes()
.getRestrictedTypeGivenToBooleanOutcome
in class JSType
outcome
- the value of the ToBoolean
predicatepublic BooleanLiteralSet getPossibleToBooleanOutcomes()
JSType
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:
type | result |
---|---|
undefined | {false} |
null | {false} |
boolean | {true, false} |
number | {true, false} |
string | {true, false} |
Object | {true} |
getPossibleToBooleanOutcomes
in class JSType
public JSType.TypePair getTypesUnderEquality(JSType that)
JSType
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
.getTypesUnderEquality
in class JSType
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
public JSType.TypePair getTypesUnderInequality(JSType that)
JSType
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.getTypesUnderInequality
in class JSType
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
public JSType.TypePair getTypesUnderShallowInequality(JSType that)
JSType
this
and that
types under
shallow inequality.getTypesUnderShallowInequality
in class JSType
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
public <T> T visit(Visitor<T> visitor)
JSType
public String toDebugHashCodeString()
JSType
toDebugHashCodeString
in class JSType
public boolean setValidator(com.google.common.base.Predicate<JSType> validator)
JSType
@extends
annotation must be an
object. Clients should inject a validator that emits a warning
if the type does not validate, and return false.setValidator
in class JSType
public JSType collapseUnion()
JSType
collapseUnion
in class JSType
public void matchConstraint(JSType constraint)
JSType
matchConstraint
in class JSType
public boolean hasAnyTemplateTypesInternal()
Copyright © 2009–2023 Google. All rights reserved.