public abstract class JSType
extends java.lang.Object
implements java.io.Serializable
Types are split into two separate families: value types and object types.
A special UnknownType exists to represent a wildcard type on which no information can
be gathered. In particular, it can assign to everyone, is a subtype of everyone (and everyone is
a subtype of it).
If you remove the UnknownType, the set of types in the type system forms a lattice
with the isSubtype(com.google.javascript.rhino.jstype.JSType) relation defining the partial order of types. All types are united at
the top of the lattice by the AllType and at the bottom by the NoType.
| Modifier and Type | Class and Description |
|---|---|
static class |
JSType.HasPropertyKind
A tristate value returned from canPropertyBeDefined.
|
static class |
JSType.Nullability
Specifies how to express nullability of reference types in annotation strings and error
messages.
|
static class |
JSType.SubtypingMode
In files translated from Java, we typecheck null and undefined loosely.
|
static class |
JSType.TypePair
a data structure that represents a pair of types
|
| Modifier and Type | Field and Description |
|---|---|
protected TemplateTypeMap |
templateTypeMap |
| Modifier and Type | Method and Description |
|---|---|
static boolean |
areIdentical(JSType a,
JSType b) |
FunctionType |
assertFunctionType()
Returns this object cast to FunctionType or throws an exception if it isn't a FunctionType.
|
ObjectType |
assertObjectType()
Returns this object cast to ObjectType or throws an exception if it isn't an ObjectType.
|
JSType |
autobox()
Dereferences a type for property access.
|
JSType |
autoboxesTo()
Turn a scalar type to the corresponding object type.
|
boolean |
canBeCalled()
This predicate is used to test whether a given type can be used as the
'function' in a function call.
|
boolean |
canCastTo(JSType that)
Tests whether values of
this type can be safely assigned
to values of that type. |
boolean |
canTestForEqualityWith(JSType that)
Tests whether
this and that are meaningfully
comparable. |
boolean |
canTestForShallowEqualityWith(JSType that)
Tests whether
this and that are meaningfully
comparable using shallow comparison. |
JSType |
collapseUnion()
Gets the least supertype of this that's not a union.
|
boolean |
containsReferenceAncestor(JSType target)
This function searchers for a type `target` in the reference chain of ProxyObjectTypes
|
ObjectType |
dereference()
Dereferences a type for property access.
|
boolean |
differsFrom(JSType that)
Whether this type is meaningfully different from
that type for the purposes of data
flow analysis. |
boolean |
equals(java.lang.Object other) |
JSType |
findPropertyType(java.lang.String propertyName)
Coerces this type to an Object type, then gets the type of the property whose name is given.
|
protected JSType |
findPropertyTypeWithoutConsideringTemplateTypes(java.lang.String propertyName)
Looks up a property on this type, but without properly replacing any templates in the result.
|
java.lang.String |
getDisplayName()
Returns a user meaningful label for the JSType instance.
|
JSType |
getEnumeratedTypeOfEnumElement() |
JSType |
getGreatestSubtype(JSType that)
Gets the greatest subtype of
this and that. |
JSType |
getGreatestSubtypeWithProperty(java.lang.String propName) |
JSDocInfo |
getJSDocInfo()
Gets the docInfo for this type.
|
JSType |
getLeastSupertype(JSType that)
Gets the least supertype of
this and that. |
abstract BooleanLiteralSet |
getPossibleToBooleanOutcomes()
Computes the set of possible outcomes of the
ToBoolean predicate
for this type. |
JSType.HasPropertyKind |
getPropertyKind(java.lang.String pname)
Checks whether the property is present on the object.
|
JSType.HasPropertyKind |
getPropertyKind(java.lang.String pname,
boolean autobox)
Checks whether the property is present on the object.
|
JSType |
getRestrictedTypeGivenOutcome(Outcome outcome)
Computes the restricted type of this type knowing that the
ToBoolean predicate has a specific value. |
int |
getTemplateParamCount()
Return the number of template parameters declared for this type.
|
TemplateTypeMap |
getTemplateTypeMap()
Returns the template type map associated with this type.
|
com.google.common.collect.ImmutableList<TemplateType> |
getTypeParameters()
Return, in order, the sequence of type parameters declared for this type.
|
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 |
getTypesUnderShallowEquality(JSType that)
Computes the subset of
this and that types under shallow
equality. |
JSType.TypePair |
getTypesUnderShallowInequality(JSType that)
Computes the subset of
this and that types under
shallow inequality. |
java.lang.Iterable<JSType> |
getUnionMembers() |
boolean |
hasAnyTemplateTypes() |
boolean |
hasDisplayName() |
int |
hashCode()
Calculates a hash of the object as per
Object.hashCode(). |
boolean |
hasProperty(java.lang.String pname)
Checks whether the property is present on the object.
|
boolean |
isAllType() |
boolean |
isArrayType() |
boolean |
isBooleanObjectType() |
boolean |
isBooleanValueType() |
boolean |
isBoxableScalar() |
boolean |
isCheckedUnknownType() |
boolean |
isConstructor()
Whether this type is a
FunctionType that is a constructor or a
named type that points to such a type. |
boolean |
isDateType() |
boolean |
isDict()
Returns true iff
this can be a dict. |
boolean |
isEmptyType() |
boolean |
isEnumElementType() |
boolean |
isEnumType() |
boolean |
isExplicitlyVoidable()
Tests whether this type explicitly allows undefined, as opposed to ? or *.
|
boolean |
isFunctionPrototypeType()
Whether this is the prototype of a function.
|
boolean |
isFunctionType()
Returns true if toMaybeFunctionType returns a non-null FunctionType.
|
boolean |
isGlobalThisType()
Returns true if this is a global this type.
|
boolean |
isInstanceType()
Whether this type is an Instance object of some constructor.
|
boolean |
isInterface()
Whether this type is a
FunctionType that is an interface or a named
type that points to such a type. |
boolean |
isLiteralObject() |
boolean |
isNamedType() |
boolean |
isNativeObjectType() |
boolean |
isNominalConstructor()
Whether this type is the original constructor of a nominal type.
|
boolean |
isNominalType()
Whether this type is a nominal type (a named instance object or
a named enum).
|
boolean |
isNoObjectType() |
boolean |
isNoResolvedType() |
boolean |
isNoType() |
boolean |
isNullable()
Tests whether this type is nullable.
|
boolean |
isNullType() |
boolean |
isNumber()
Tests whether the type is a number (value or Object).
|
boolean |
isNumberObjectType() |
boolean |
isNumberValueType() |
boolean |
isObject()
Tests whether this type is an
Object, or any subtype thereof. |
boolean |
isObjectType()
Tests whether this type is an
Object, or any subtype thereof. |
boolean |
isOrdinaryFunction()
Whether this type is a
FunctionType that is an ordinary function (i.e. |
boolean |
isRawTypeOfTemplatizedType() |
boolean |
isRecordType() |
boolean |
isRegexpType() |
boolean |
isResolved()
Returns whether the type has undergone resolution.
|
boolean |
isSomeUnknownType() |
boolean |
isString()
Tests whether the type is a string (value or Object).
|
boolean |
isStringObjectType() |
boolean |
isStringValueType() |
boolean |
isStruct()
Returns true iff
this can be a struct. |
boolean |
isStructuralInterface() |
boolean |
isStructuralType() |
boolean |
isSubtype(JSType supertype)
Checks whether
this is a subtype of that. |
boolean |
isSubtype(JSType supertype,
JSType.SubtypingMode mode)
Deprecated.
Prefer
isSubtype(JSType) instead. |
boolean |
isSubtypeOf(JSType supertype) |
boolean |
isSubtypeOf(JSType supertype,
JSType.SubtypingMode mode) |
boolean |
isSubtypeWithoutStructuralTyping(JSType supertype)
the logic of this method is similar to isSubtype, except that it does not perform structural
interface matching
|
boolean |
isSuccessfullyResolved()
Returns whether the type has undergone resolution and resolved to a "useful" type.
|
boolean |
isSymbol() |
boolean |
isSymbolObjectType() |
boolean |
isSymbolValueType() |
boolean |
isTemplateType() |
boolean |
isTemplatizedType() |
boolean |
isUnionType() |
boolean |
isUnknownType() |
boolean |
isUnresolved() |
boolean |
isUnresolvedOrResolvedUnknown() |
boolean |
isUnsuccessfullyResolved()
Returns whether the type has undergone resolution and resolved to a "useless" type.
|
boolean |
isVoidable()
Tests whether this type is voidable.
|
boolean |
isVoidType() |
boolean |
loosenTypecheckingDueToForwardReferencedSupertype()
During type definition, was one of the supertypes of this type a forward reference?
|
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. |
boolean |
matchesSymbolContext()
This predicate is used to test whether a given type can appear in a
symbol context such as property access. |
void |
mergeSupertypeTemplateTypes(ObjectType other)
Prepends the template type map associated with this type, merging in the keys and values of the
specified map.
|
JSType |
resolve(ErrorReporter reporter)
Resolve this type in the given scope.
|
JSType |
restrictByNotNull()
If this is a union type, returns a union type that does not include the null type.
|
JSType |
restrictByNotNullOrUndefined()
If this is a union type, returns a union type that does not include
the null or undefined type.
|
JSType |
restrictByNotUndefined()
If this is a union type, returns a union type that does not include the 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. |
java.lang.String |
toAnnotationString(JSType.Nullability nullability) |
EnumElementType |
toMaybeEnumElementType()
Downcasts this to an EnumElementType, or returns null if this is not an EnumElementType.
|
EnumType |
toMaybeEnumType()
Downcasts this to an EnumType, or returns null if this is not an EnumType.
|
FunctionType |
toMaybeFunctionType()
Downcasts this to a FunctionType, or returns null if this is not a function.
|
static FunctionType |
toMaybeFunctionType(JSType type)
Null-safe version of toMaybeFunctionType().
|
NamedType |
toMaybeNamedType() |
ObjectType |
toMaybeObjectType() |
RecordType |
toMaybeRecordType()
Downcasts this to a RecordType, or returns null if this is not
a RecordType.
|
TemplateType |
toMaybeTemplateType()
Downcasts this to a TemplateType, or returns null if this is not
a function.
|
TemplatizedType |
toMaybeTemplatizedType()
Downcasts this to a TemplatizedType, or returns null if this is not
a function.
|
UnionType |
toMaybeUnionType()
Downcasts this to a UnionType, or returns null if this is not a UnionType.
|
ObjectType |
toObjectType()
Casts this to an ObjectType, or returns null if this is not an ObjectType.
|
java.lang.String |
toString()
A string representation of this type, suitable for printing
in warnings.
|
JSType |
unboxesTo()
Turn an object type to its corresponding scalar type.
|
abstract <T> T |
visit(Visitor<T> visitor)
Visit this type with the given visitor.
|
protected TemplateTypeMap templateTypeMap
public JSDocInfo getJSDocInfo()
public java.lang.String getDisplayName()
public boolean hasDisplayName()
public JSType.HasPropertyKind getPropertyKind(java.lang.String pname)
pname - The property name.public JSType.HasPropertyKind getPropertyKind(java.lang.String pname, boolean autobox)
pname - The property name.autobox - Whether to check for the presents on an autoboxed typepublic final boolean hasProperty(java.lang.String pname)
pname - The property name.public boolean isNoType()
public boolean isNoResolvedType()
public final boolean isUnresolved()
public final boolean isUnresolvedOrResolvedUnknown()
public boolean isNoObjectType()
public final boolean isEmptyType()
public boolean isNumberObjectType()
public boolean isNumberValueType()
public boolean isFunctionPrototypeType()
public boolean isStringObjectType()
public boolean isSymbolObjectType()
public boolean isStringValueType()
public boolean isSymbolValueType()
public final boolean isString()
this <: (String, string)public final boolean isNumber()
this <: (Number, number)public final boolean isSymbol()
public boolean isArrayType()
public boolean isBooleanObjectType()
public boolean isBooleanValueType()
public boolean isRegexpType()
public boolean isDateType()
public boolean isNullType()
public boolean isVoidType()
public boolean isAllType()
public boolean isUnknownType()
public final boolean isSomeUnknownType()
public boolean isCheckedUnknownType()
public final boolean isUnionType()
public final boolean isRawTypeOfTemplatizedType()
public boolean isStruct()
this can be a struct.
UnionType overrides the method, assume this is not a union here.public boolean isDict()
this can be a dict.
UnionType overrides the method, assume this is not a union here.public final boolean containsReferenceAncestor(JSType target)
public final boolean isLiteralObject()
public JSType getGreatestSubtypeWithProperty(java.lang.String propName)
public UnionType toMaybeUnionType()
public final boolean isGlobalThisType()
public final boolean isFunctionType()
public FunctionType toMaybeFunctionType()
For the purposes of this function, we define a MaybeFunctionType as any type in the sub-lattice { x | LEAST_FUNCTION_TYPE <= x <= GREATEST_FUNCTION_TYPE } This definition excludes bottom types like NoType and NoObjectType.
This definition is somewhat arbitrary and axiomatic, but this is the definition that makes the most sense for the most callers.
public FunctionType assertFunctionType()
public ObjectType assertObjectType()
public static FunctionType toMaybeFunctionType(JSType type)
public final boolean isEnumElementType()
public final JSType getEnumeratedTypeOfEnumElement()
public EnumElementType toMaybeEnumElementType()
public boolean isEnumType()
public EnumType toMaybeEnumType()
public boolean isNamedType()
public NamedType toMaybeNamedType()
public boolean isRecordType()
public boolean isStructuralInterface()
public boolean isStructuralType()
public RecordType toMaybeRecordType()
public final boolean isTemplatizedType()
public TemplatizedType toMaybeTemplatizedType()
public final boolean isTemplateType()
public TemplateType toMaybeTemplateType()
public boolean hasAnyTemplateTypes()
public TemplateTypeMap getTemplateTypeMap()
public final com.google.common.collect.ImmutableList<TemplateType> getTypeParameters()
In general, this value corresponds to an element for every `@template` declaration on the type definition. It does not include template parameters from superclasses or superinterfaces.
public int getTemplateParamCount()
In general, this value corresponds to the number of `@template` declarations on the type definition. It does not include template parameters from superclasses or superinterfaces.
public void mergeSupertypeTemplateTypes(ObjectType other)
public boolean isObject()
Object, or any subtype thereof.this <: Objectpublic final boolean isObjectType()
Object, or any subtype thereof.this <: Objectpublic boolean isConstructor()
FunctionType that is a constructor or a
named type that points to such a type.public boolean isNominalType()
public final boolean isNominalConstructor()
public boolean isNativeObjectType()
public boolean loosenTypecheckingDueToForwardReferencedSupertype()
This is a hack to work around the fact that inheritance chains and template types aren't wired up correctly when this happens, which causes various false positives in checks. The known bugs associated are b/145145406, b/144327372, and b/132980305.
This method should only be used to suppress potential false positives caused by one of the above bugs, in the case where we think suppressing typechecking is preferable to emitting a false positive.
public boolean isInstanceType()
InstanceObjectType.public boolean isInterface()
FunctionType that is an interface or a named
type that points to such a type.public boolean isOrdinaryFunction()
FunctionType that is an ordinary function (i.e. not a
constructor, nominal interface, or record interface), or a named type that points to such a
type.public final boolean equals(@Nullable
java.lang.Object other)
equals in class java.lang.Objectpublic final boolean differsFrom(JSType that)
that type for the purposes of data
flow analysis.
This is a trickier check than pure equality, because it has to properly handle unknown
types. See EqMethod for more info.
public final int hashCode()
Object.hashCode().
This method is unsafe for multi-threaded use. The implementation mutates instance state to prevent recursion and therefore expects sole access.
hashCode in class java.lang.Objectpublic boolean matchesNumberContext()
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.public boolean matchesSymbolContext()
symbol context such as property access.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.@Nullable public final JSType findPropertyType(java.lang.String propertyName)
Unlike ObjectType.getPropertyType(java.lang.String), returns null if the property is not found.
null if the current type cannot have properties, or if the
type is not found.@ForOverride @Nullable protected JSType findPropertyTypeWithoutConsideringTemplateTypes(java.lang.String propertyName)
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
public boolean canBeCalled()
true if this type might be callable.public final boolean canCastTo(JSType that)
this type can be safely assigned
to values of that type.
The default implementation verifies that this is a subtype
of that.
public JSType autoboxesTo()
null if this type is not a scalar.public boolean isBoxableScalar()
public JSType unboxesTo()
null if this type does not unbox.public ObjectType toObjectType()
public JSType autobox()
@Nullable public final ObjectType dereference()
public final boolean canTestForEqualityWith(JSType that)
this and that are meaningfully
comparable. By meaningfully, we mean compatible types that do not lead
to step 22 of the definition of the Abstract Equality Comparison
Algorithm (11.9.3, page 55–56) of the ECMA-262 specification.public TernaryValue testForEquality(JSType that)
this and that.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 final boolean canTestForShallowEqualityWith(JSType that)
this and that are meaningfully
comparable using shallow comparison. By meaningfully, we mean compatible
types that are not rejected by step 1 of the definition of the Strict
Equality Comparison Algorithm (11.9.6, page 56–57) of the
ECMA-262 specification.public boolean isNullable()
public boolean isVoidable()
public boolean isExplicitlyVoidable()
public JSType collapseUnion()
public JSType getLeastSupertype(JSType that)
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
this ∨ thatpublic JSType getGreatestSubtype(JSType that)
this and that. The greatest subtype is the meet
(∧) or infimum of both types in the type lattice.
Examples
Number ∧ Any = Any
number ∧ Object = Any
Number ∧ Object = Number
this ∨ thatpublic JSType getRestrictedTypeGivenOutcome(Outcome outcome)
ToBoolean predicate has a specific value. For more information
about the ToBoolean predicate, see
getPossibleToBooleanOutcomes().outcome - the value of the ToBoolean predicatepublic abstract BooleanLiteralSet getPossibleToBooleanOutcomes()
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} |
public JSType.TypePair getTypesUnderEquality(JSType that)
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.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 nullpublic JSType.TypePair getTypesUnderInequality(JSType that)
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.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 nullpublic JSType.TypePair getTypesUnderShallowEquality(JSType that)
this and that types under shallow
equality.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)
this and that types under
shallow inequality.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 nullpublic java.lang.Iterable<JSType> getUnionMembers()
public JSType restrictByNotNullOrUndefined()
public JSType restrictByNotUndefined()
public JSType restrictByNotNull()
public final boolean isSubtypeWithoutStructuralTyping(JSType supertype)
This function is added for disambiguate properties, and is deprecated for the other use cases.
public final boolean isSubtype(JSType supertype)
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.
this <: that@Deprecated public final boolean isSubtype(JSType supertype, JSType.SubtypingMode mode)
isSubtype(JSType) instead.public final boolean isSubtypeOf(JSType supertype)
public final boolean isSubtypeOf(JSType supertype, JSType.SubtypingMode mode)
public abstract <T> T visit(Visitor<T> visitor)
Visitorpublic final JSType resolve(ErrorReporter reporter)
The returned value must be equal to this, as defined by equals(java.lang.Object). It may or
may not be the same object. This method may modify the internal state of this, as long
as it does so in a way that preserves Object equality.
For efficiency, we should only resolve a type once per compilation job. For incremental compilations, one compilation job may need the artifacts from a previous generation, so we will eventually need a generational flag instead of a boolean one.
public final boolean isResolved()
A value of true does not indicate that resolution was successful, only that
it was attempted and has finished.
public final boolean isSuccessfullyResolved()
public final boolean isUnsuccessfullyResolved()
public boolean setValidator(com.google.common.base.Predicate<JSType> validator)
@extends annotation must be an
object. Clients should inject a validator that emits a warning
if the type does not validate, and return false.public java.lang.String toString()
toString in class java.lang.Objectpublic final java.lang.String toAnnotationString(JSType.Nullability nullability)
public void matchConstraint(JSType constraint)
constraint - public ObjectType toMaybeObjectType()
Copyright © 2009-2020 Google. All Rights Reserved.