Skip to content

Commit 04e5309

Browse files
committed
Merge branch 'unionTypes' into unionTypesLS
Conflicts: src/compiler/checker.ts
2 parents 4442b45 + c9a42c1 commit 04e5309

File tree

85 files changed

+1570
-861
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+1570
-861
lines changed

src/compiler/checker.ts

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2066,7 +2066,7 @@ module ts {
20662066
}
20672067

20682068
function resolveTupleTypeMembers(type: TupleType) {
2069-
var arrayType = resolveObjectTypeMembers(createArrayType(getBestCommonType(type.elementTypes)));
2069+
var arrayType = resolveObjectTypeMembers(createArrayType(getUnionType(type.elementTypes)));
20702070
var members = createTupleTypeMemberSymbols(type.elementTypes);
20712071
addInheritedMembers(members, arrayType.properties);
20722072
setObjectTypeMembers(type, members, arrayType.callSignatures, arrayType.constructSignatures, arrayType.stringIndexType, arrayType.numberIndexType);
@@ -2724,13 +2724,41 @@ module ts {
27242724
}
27252725
}
27262726

2727-
function getUnionType(types: Type[]): Type {
2727+
function containsAnyType(types: Type[]) {
2728+
for (var i = 0; i < types.length; i++) {
2729+
if (types[i].flags & TypeFlags.Any) {
2730+
return true;
2731+
}
2732+
}
2733+
return false;
2734+
}
2735+
2736+
function removeAllButLast(types: Type[], typeToRemove: Type) {
2737+
var i = types.length;
2738+
while (i > 0 && types.length > 1) {
2739+
i--;
2740+
if (types[i] === typeToRemove) {
2741+
types.splice(i, 1);
2742+
}
2743+
}
2744+
}
2745+
2746+
function getUnionType(types: Type[], noSubtypeReduction?: boolean): Type {
27282747
if (types.length === 0) {
27292748
return emptyObjectType;
27302749
}
27312750
var sortedTypes: Type[] = [];
27322751
addTypesToSortedSet(sortedTypes, types);
2733-
removeSubtypes(sortedTypes);
2752+
if (noSubtypeReduction) {
2753+
if (containsAnyType(sortedTypes)) {
2754+
return anyType;
2755+
}
2756+
removeAllButLast(sortedTypes, undefinedType);
2757+
removeAllButLast(sortedTypes, nullType);
2758+
}
2759+
else {
2760+
removeSubtypes(sortedTypes);
2761+
}
27342762
if (sortedTypes.length === 1) {
27352763
return sortedTypes[0];
27362764
}
@@ -2746,7 +2774,7 @@ module ts {
27462774
function getTypeFromUnionTypeNode(node: UnionTypeNode): Type {
27472775
var links = getNodeLinks(node);
27482776
if (!links.resolvedType) {
2749-
links.resolvedType = getUnionType(map(node.types, getTypeFromTypeNode));
2777+
links.resolvedType = getUnionType(map(node.types, getTypeFromTypeNode), /*noSubtypeReduction*/ true);
27502778
}
27512779
return links.resolvedType;
27522780
}
@@ -2964,7 +2992,7 @@ module ts {
29642992
return createTupleType(instantiateList((<TupleType>type).elementTypes, mapper, instantiateType));
29652993
}
29662994
if (type.flags & TypeFlags.Union) {
2967-
return getUnionType(instantiateList((<UnionType>type).types, mapper, instantiateType));
2995+
return getUnionType(instantiateList((<UnionType>type).types, mapper, instantiateType), /*noSubtypeReduction*/ true);
29682996
}
29692997
}
29702998
return type;
@@ -3614,7 +3642,7 @@ module ts {
36143642
return forEach(types, t => isSupertypeOfEach(t, types) ? t : undefined);
36153643
}
36163644

3617-
function getBestCommonType(types: Type[], contextualType?: Type): Type {
3645+
function getBestCommonType(types: Type[], contextualType: Type): Type {
36183646
return contextualType && isSupertypeOfEach(contextualType, types) ? contextualType : getUnionType(types);
36193647
}
36203648

@@ -4567,7 +4595,7 @@ module ts {
45674595
return createTupleType(elementTypes);
45684596
}
45694597
var contextualElementType = contextualType && !isInferentialContext(contextualMapper) ? getIndexTypeOfType(contextualType, IndexKind.Number) : undefined;
4570-
var elementType = elements.length || contextualElementType ? getBestCommonType(deduplicate(elementTypes), contextualElementType) : undefinedType;
4598+
var elementType = elements.length || contextualElementType ? getBestCommonType(elementTypes, contextualElementType) : undefinedType;
45714599
return createArrayType(elementType);
45724600
}
45734601

@@ -5610,7 +5638,7 @@ module ts {
56105638
case SyntaxKind.AmpersandAmpersandToken:
56115639
return rightType;
56125640
case SyntaxKind.BarBarToken:
5613-
return getBestCommonType([leftType, rightType], isInferentialContext(contextualMapper) ? undefined : getContextualType(node));
5641+
return getUnionType([leftType, rightType]);
56145642
case SyntaxKind.EqualsToken:
56155643
checkAssignmentOperator(rightType);
56165644
return rightType;
@@ -5660,9 +5688,7 @@ module ts {
56605688
checkExpression(node.condition);
56615689
var type1 = checkExpression(node.whenTrue, contextualMapper);
56625690
var type2 = checkExpression(node.whenFalse, contextualMapper);
5663-
var contextualType = isInferentialContext(contextualMapper) ? undefined : getContextualType(node);
5664-
var resultType = getBestCommonType([type1, type2], contextualType);
5665-
return resultType;
5691+
return getUnionType([type1, type2]);
56665692
}
56675693

56685694
function checkExpressionWithContextualType(node: Expression, contextualType: Type, contextualMapper?: TypeMapper): Type {

tests/baselines/reference/aliasUsageInOrExpression.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ var f: { x: IHasVisualizationModel } = <{ x: IHasVisualizationModel }>null ? { x
5353
>f : { x: IHasVisualizationModel; }
5454
>x : IHasVisualizationModel
5555
>IHasVisualizationModel : IHasVisualizationModel
56-
><{ x: IHasVisualizationModel }>null ? { x: moduleA } : null : { x: IHasVisualizationModel; }
56+
><{ x: IHasVisualizationModel }>null ? { x: moduleA } : null : { x: typeof moduleA; }
5757
><{ x: IHasVisualizationModel }>null : { x: IHasVisualizationModel; }
5858
>x : IHasVisualizationModel
5959
>IHasVisualizationModel : IHasVisualizationModel

0 commit comments

Comments
 (0)