boolean canCastToUnion(JSType thisType, UnionType unionType) { for (JSType type : unionType.getAlternates()) { if (thisType.visit(this, type)) { return true; } } return false; }
@Override public boolean isStruct() { for (JSType typ : getAlternates()) { if (typ.isStruct()) { return true; } } return false; }
@Override public boolean isDict() { for (JSType typ : getAlternates()) { if (typ.isDict()) { return true; } } return false; }
@Override public Set<String> caseUnionType(UnionType type) { // Visit the alternatives. // T1|T2|T3 for (JSType alternateType : type.getAlternates()) { visitOnce(alternateType); } return externProperties; }
boolean canCastToUnion(JSType thisType, UnionType unionType) { for (JSType type : unionType.getAlternates()) { if (thisType.visit(this, type)) { return true; } } return false; }
@Override public boolean isStruct() { return anyMatch(JSType::isStruct, getAlternates()); }
@Override public boolean isDict() { return anyMatch(JSType::isDict, getAlternates()); }
@Override public JSType caseUnionType(UnionType type) { JSType restricted = null; for (JSType alternate : type.getAlternates()) { JSType restrictedAlternate = alternate.visit(this); if (restrictedAlternate != null) { if (restricted == null) { restricted = restrictedAlternate; } else { restricted = restrictedAlternate.getLeastSupertype(restricted); } } } return restricted; }
@Override public JSType caseUnionType(UnionType type) { JSType restricted = null; for (JSType alternate : type.getAlternates()) { JSType restrictedAlternate = alternate.visit(this); if (restrictedAlternate != null) { if (restricted == null) { restricted = restrictedAlternate; } else { restricted = restrictedAlternate.getLeastSupertype(restricted); } } } return restricted; }
@Override public JSType caseUnionType(UnionType type) { boolean changed = false; List<JSType> results = new ArrayList<JSType>(); for (JSType alternative : type.getAlternates()) { JSType replacement = alternative.visit(this); if (replacement != alternative) { changed = true; } results.add(replacement); } if (changed) { UnionTypeBuilder builder = new UnionTypeBuilder(registry); for (JSType alternate : results) { builder.addAlternate(alternate); } return builder.build(); // maybe not a union } return type; }
@Override public JSType caseUnionType(UnionType type) { boolean changed = false; List<JSType> results = new ArrayList<>(); for (JSType alternative : type.getAlternates()) { JSType replacement = alternative.visit(this); if (replacement != alternative) { changed = true; } results.add(replacement); } if (changed) { UnionTypeBuilder builder = UnionTypeBuilder.create(registry); for (JSType alternate : results) { builder.addAlternate(alternate); } return builder.build(); // maybe not a union } return type; }
private void printErrorLocations(List<String> errors, JSType t) { if (!t.isObject() || t.isAllType()) { return; } if (t.isUnionType()) { for (JSType alt : t.toMaybeUnionType().getAlternates()) { printErrorLocations(errors, alt); } return; } for (JSError error : invalidationMap.get(t)) { errors.add(t + " at " + error.sourceName + ":" + error.lineNumber); } }
private static boolean containsForwardDeclaredUnresolvedName(JSType type) { if (type.isUnionType()) { for (JSType alt : type.toMaybeUnionType().getAlternates()) { if (containsForwardDeclaredUnresolvedName(alt)) { return true; } } } return type.isNoResolvedType(); }
private void addReferenceTypeIndexedByProperty( String propertyName, JSType type) { if (type instanceof ObjectType && ((ObjectType) type).hasReferenceName()) { Map<String, ObjectType> typeSet = eachRefTypeIndexedByProperty.computeIfAbsent(propertyName, k -> new LinkedHashMap<>()); ObjectType objType = (ObjectType) type; typeSet.put(objType.getReferenceName(), objType); } else if (type instanceof NamedType) { addReferenceTypeIndexedByProperty( propertyName, ((NamedType) type).getReferencedType()); } else if (type.isUnionType()) { for (JSType alternate : type.toMaybeUnionType().getAlternates()) { addReferenceTypeIndexedByProperty(propertyName, alternate); } } }
private static boolean containsForwardDeclaredUnresolvedName(JSType type) { if (type.isUnionType()) { for (JSType alt : type.toMaybeUnionType().getAlternates()) { if (containsForwardDeclaredUnresolvedName(alt)) { return true; } } } return type.isNoResolvedType(); }
private boolean conforms(JSType type) { if (type.isUnionType()) { // unwrap union types which might contain unresolved type name // references for example {Foo|undefined} for (JSType part : type.toMaybeUnionType().getAlternates()) { if (!conforms(part)) { return false; } } return true; } else { return !type.isNoResolvedType(); } } }
@Override public JSType findPropertyType(String propertyName) { JSType propertyType = null; for (JSType alternate : getAlternates()) { // Filter out the null/undefined type. if (alternate.isNullType() || alternate.isVoidType()) { continue; } JSType altPropertyType = alternate.findPropertyType(propertyName); if (altPropertyType == null) { continue; } if (propertyType == null) { propertyType = altPropertyType; } else { propertyType = propertyType.getLeastSupertype(altPropertyType); } } return propertyType; }
@Override protected JSType findPropertyTypeWithoutConsideringTemplateTypes(String propertyName) { JSType propertyType = null; for (JSType alternate : getAlternates()) { // Filter out the null/undefined type. if (alternate.isNullType() || alternate.isVoidType()) { continue; } JSType altPropertyType = alternate.findPropertyType(propertyName); if (altPropertyType == null) { continue; } if (propertyType == null) { propertyType = altPropertyType; } else { propertyType = propertyType.getLeastSupertype(altPropertyType); } } return propertyType; }
private boolean containsArray(JSType type) { if (isArray(type)) { return true; } if (type.isUnionType()) { JSType arrayType = typeRegistry.getNativeType(ARRAY_TYPE); for (JSType alternate : type.toMaybeUnionType().getAlternates()) { if (alternate.isSubtype(arrayType)) { return true; } } } return false; }
private void addEventize(JSType thisType, JSType thatType) { if (collectorFilterType(thisType) || collectorFilterType(thatType) || thisType.isEquivalentTo(thatType)) { return; } String className = thisType.getDisplayName(); if (thatType.isUnionType()) { UnionType ut = thatType.toMaybeUnionType(); for (JSType type : ut.getAlternates()) { if (type.isObject()) { addEventizeClass(className, type); } } } else { addEventizeClass(className, thatType); } }