Add circularity checking during deferred type argument creation (#34791)

This commit is contained in:
Wesley Wigham
2019-10-30 13:36:43 -07:00
committed by GitHub
parent 8b7664ae15
commit 5e0fbc677a
7 changed files with 121 additions and 1 deletions

View File

@@ -163,6 +163,7 @@ namespace ts {
ImmediateBaseConstraint,
EnumTagType,
JSDocTypeReference,
ResolvedTypeArguments,
}
const enum CheckMode {
@@ -6560,6 +6561,8 @@ namespace ts {
return !!(<Type>target).immediateBaseConstraint;
case TypeSystemPropertyName.JSDocTypeReference:
return !!getSymbolLinks(target as Symbol).resolvedJSDocType;
case TypeSystemPropertyName.ResolvedTypeArguments:
return !!(target as TypeReference).resolvedTypeArguments;
}
return Debug.assertNever(propertyName);
}
@@ -10650,12 +10653,28 @@ namespace ts {
function getTypeArguments(type: TypeReference): readonly Type[] {
if (!type.resolvedTypeArguments) {
if (!pushTypeResolution(type, TypeSystemPropertyName.ResolvedTypeArguments)) {
return type.target.localTypeParameters?.map(() => errorType) || emptyArray;
}
const node = type.node;
const typeArguments = !node ? emptyArray :
node.kind === SyntaxKind.TypeReference ? concatenate(type.target.outerTypeParameters, getEffectiveTypeArguments(node, type.target.localTypeParameters!)) :
node.kind === SyntaxKind.ArrayType ? [getTypeFromTypeNode(node.elementType)] :
map(node.elementTypes, getTypeFromTypeNode);
type.resolvedTypeArguments = type.mapper ? instantiateTypes(typeArguments, type.mapper) : typeArguments;
if (popTypeResolution()) {
type.resolvedTypeArguments = type.mapper ? instantiateTypes(typeArguments, type.mapper) : typeArguments;
}
else {
type.resolvedTypeArguments = type.target.localTypeParameters?.map(() => errorType) || emptyArray;
error(
type.node || currentNode,
type.target.symbol
? Diagnostics.Type_arguments_for_0_circularly_reference_themselves
: Diagnostics.Tuple_type_arguments_circularly_reference_themselves
,
type.target.symbol && symbolToString(type.target.symbol)
);
}
}
return type.resolvedTypeArguments;
}

View File

@@ -3136,6 +3136,14 @@
"category": "Error",
"code": 4108
},
"Type arguments for '{0}' circularly reference themselves.": {
"category": "Error",
"code": 4109
},
"Tuple type arguments circularly reference themselves.": {
"category": "Error",
"code": 4110
},
"The current host does not support the '{0}' option.": {
"category": "Error",