mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-17 21:06:50 -05:00
Merge pull request #22764 from Microsoft/fixInferTypeDeclarationFiles
Fix missing 'infer T' in declaration files
This commit is contained in:
@@ -101,7 +101,6 @@ namespace ts {
|
||||
HasLocals = 1 << 5,
|
||||
IsInterface = 1 << 6,
|
||||
IsObjectLiteralOrClassExpressionMethod = 1 << 7,
|
||||
IsInferenceContainer = 1 << 8,
|
||||
}
|
||||
|
||||
const binder = createBinder();
|
||||
@@ -121,7 +120,6 @@ namespace ts {
|
||||
let container: Node;
|
||||
let containerContainer: Node; // Container one level up
|
||||
let blockScopeContainer: Node;
|
||||
let inferenceContainer: Node;
|
||||
let lastContainer: Node;
|
||||
let seenThisKeyword: boolean;
|
||||
|
||||
@@ -190,7 +188,6 @@ namespace ts {
|
||||
container = undefined;
|
||||
containerContainer = undefined;
|
||||
blockScopeContainer = undefined;
|
||||
inferenceContainer = undefined;
|
||||
lastContainer = undefined;
|
||||
seenThisKeyword = false;
|
||||
currentFlow = undefined;
|
||||
@@ -569,13 +566,6 @@ namespace ts {
|
||||
bindChildren(node);
|
||||
node.flags = seenThisKeyword ? node.flags | NodeFlags.ContainsThis : node.flags & ~NodeFlags.ContainsThis;
|
||||
}
|
||||
else if (containerFlags & ContainerFlags.IsInferenceContainer) {
|
||||
const saveInferenceContainer = inferenceContainer;
|
||||
inferenceContainer = node;
|
||||
node.locals = undefined;
|
||||
bindChildren(node);
|
||||
inferenceContainer = saveInferenceContainer;
|
||||
}
|
||||
else {
|
||||
bindChildren(node);
|
||||
}
|
||||
@@ -1434,9 +1424,6 @@ namespace ts {
|
||||
case SyntaxKind.MappedType:
|
||||
return ContainerFlags.IsContainer | ContainerFlags.HasLocals;
|
||||
|
||||
case SyntaxKind.ConditionalType:
|
||||
return ContainerFlags.IsInferenceContainer;
|
||||
|
||||
case SyntaxKind.SourceFile:
|
||||
return ContainerFlags.IsContainer | ContainerFlags.IsControlFlowContainer | ContainerFlags.HasLocals;
|
||||
|
||||
@@ -2638,13 +2625,25 @@ namespace ts {
|
||||
: declareSymbolAndAddToSymbolTable(node, symbolFlags, symbolExcludes);
|
||||
}
|
||||
|
||||
function getInferTypeContainer(node: Node): ConditionalTypeNode {
|
||||
while (node) {
|
||||
const parent = node.parent;
|
||||
if (parent && parent.kind === SyntaxKind.ConditionalType && (<ConditionalTypeNode>parent).extendsType === node) {
|
||||
return <ConditionalTypeNode>parent;
|
||||
}
|
||||
node = parent;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function bindTypeParameter(node: TypeParameterDeclaration) {
|
||||
if (node.parent.kind === SyntaxKind.InferType) {
|
||||
if (inferenceContainer) {
|
||||
if (!inferenceContainer.locals) {
|
||||
inferenceContainer.locals = createSymbolTable();
|
||||
const container = getInferTypeContainer(node.parent);
|
||||
if (container) {
|
||||
if (!container.locals) {
|
||||
container.locals = createSymbolTable();
|
||||
}
|
||||
declareSymbol(inferenceContainer.locals, /*parent*/ undefined, node, SymbolFlags.TypeParameter, SymbolFlags.TypeParameterExcludes);
|
||||
declareSymbol(container.locals, /*parent*/ undefined, node, SymbolFlags.TypeParameter, SymbolFlags.TypeParameterExcludes);
|
||||
}
|
||||
else {
|
||||
bindAnonymousDeclaration(node, SymbolFlags.TypeParameter, getDeclarationName(node));
|
||||
|
||||
@@ -2895,7 +2895,8 @@ namespace ts {
|
||||
flags,
|
||||
tracker: tracker && tracker.trackSymbol ? tracker : { trackSymbol: noop },
|
||||
encounteredError: false,
|
||||
symbolStack: undefined
|
||||
symbolStack: undefined,
|
||||
inferTypeParameters: undefined
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2987,6 +2988,9 @@ namespace ts {
|
||||
return typeReferenceToTypeNode(<TypeReference>type);
|
||||
}
|
||||
if (type.flags & TypeFlags.TypeParameter || objectFlags & ObjectFlags.ClassOrInterface) {
|
||||
if (type.flags & TypeFlags.TypeParameter && contains(context.inferTypeParameters, type)) {
|
||||
return createInferTypeNode(createTypeParameterDeclaration(getNameOfSymbolAsWritten(type.symbol)));
|
||||
}
|
||||
const name = type.symbol ? symbolToName(type.symbol, context, SymbolFlags.Type, /*expectsIdentifier*/ false) : createIdentifier("?");
|
||||
// Ignore constraint/default when creating a usage (as opposed to declaration) of a type parameter.
|
||||
return createTypeReferenceNode(name, /*typeArguments*/ undefined);
|
||||
@@ -3027,7 +3031,10 @@ namespace ts {
|
||||
}
|
||||
if (type.flags & TypeFlags.Conditional) {
|
||||
const checkTypeNode = typeToTypeNodeHelper((<ConditionalType>type).checkType, context);
|
||||
const saveInferTypeParameters = context.inferTypeParameters;
|
||||
context.inferTypeParameters = (<ConditionalType>type).root.inferTypeParameters;
|
||||
const extendsTypeNode = typeToTypeNodeHelper((<ConditionalType>type).extendsType, context);
|
||||
context.inferTypeParameters = saveInferTypeParameters;
|
||||
const trueTypeNode = typeToTypeNodeHelper(getTrueTypeFromConditionalType(<ConditionalType>type), context);
|
||||
const falseTypeNode = typeToTypeNodeHelper(getFalseTypeFromConditionalType(<ConditionalType>type), context);
|
||||
return createConditionalTypeNode(checkTypeNode, extendsTypeNode, trueTypeNode, falseTypeNode);
|
||||
@@ -3692,6 +3699,7 @@ namespace ts {
|
||||
// State
|
||||
encounteredError: boolean;
|
||||
symbolStack: Symbol[] | undefined;
|
||||
inferTypeParameters: TypeParameter[] | undefined;
|
||||
}
|
||||
|
||||
function isDefaultBindingContext(location: Node) {
|
||||
|
||||
Reference in New Issue
Block a user