@@ -855,6 +855,7 @@ import {
855
855
ModuleKind,
856
856
ModuleResolutionKind,
857
857
ModuleSpecifierResolutionHost,
858
+ Mutable,
858
859
NamedDeclaration,
859
860
NamedExports,
860
861
NamedImportsOrExports,
@@ -6469,6 +6470,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
6469
6470
typePredicateToTypePredicateNode: (typePredicate: TypePredicate, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => typePredicateToTypePredicateNodeHelper(typePredicate, context)),
6470
6471
expressionOrTypeToTypeNode: (expr: Expression | JsxAttributeValue | undefined, type: Type, addUndefined?: boolean, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => expressionOrTypeToTypeNode(context, expr, type, addUndefined)),
6471
6472
serializeTypeForDeclaration: (type: Type, symbol: Symbol, addUndefined?: boolean, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => serializeTypeForDeclaration(context, type, symbol, enclosingDeclaration, /*includePrivateSymbol*/ undefined, /*bundled*/ undefined, addUndefined)),
6473
+ serializeReturnTypeForSignature: (signature: Signature, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => serializeReturnTypeForSignature(context, signature)),
6472
6474
indexInfoToIndexSignatureDeclaration: (indexInfo: IndexInfo, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => indexInfoToIndexSignatureDeclarationHelper(indexInfo, context, /*typeNode*/ undefined)),
6473
6475
signatureToSignatureDeclaration: (signature: Signature, kind: SignatureDeclaration["kind"], enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => signatureToSignatureDeclarationHelper(signature, kind, context)),
6474
6476
symbolToEntityName: (symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => symbolToName(symbol, context, meaning, /*expectsIdentifier*/ false)),
@@ -7649,8 +7651,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
7649
7651
}
7650
7652
7651
7653
function signatureToSignatureDeclarationHelper(signature: Signature, kind: SignatureDeclaration["kind"], context: NodeBuilderContext, options?: SignatureToSignatureDeclarationOptions): SignatureDeclaration {
7652
- const suppressAny = context.flags & NodeBuilderFlags.SuppressAnyReturnType ;
7653
- if (suppressAny) context.flags &= ~NodeBuilderFlags.SuppressAnyReturnType; // suppress only toplevel `any`s
7654
+ const flags = context.flags;
7655
+ context.flags &= ~NodeBuilderFlags.SuppressAnyReturnType; // SuppressAnyReturnType should only apply to the signature `return` position
7654
7656
context.approximateLength += 3; // Usually a signature contributes a few more characters than this, but 3 is the minimum
7655
7657
let typeParameters: TypeParameterDeclaration[] | undefined;
7656
7658
let typeArguments: TypeNode[] | undefined;
@@ -7780,21 +7782,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
7780
7782
if (thisParameter) {
7781
7783
parameters.unshift(thisParameter);
7782
7784
}
7785
+ context.flags = flags;
7786
+
7787
+ const returnTypeNode = serializeReturnTypeForSignature(context, signature, options?.privateSymbolVisitor, options?.bundledImports);
7783
7788
7784
- let returnTypeNode: TypeNode | undefined;
7785
- const typePredicate = getTypePredicateOfSignature(signature);
7786
- if (typePredicate) {
7787
- returnTypeNode = typePredicateToTypePredicateNodeHelper(typePredicate, context);
7788
- }
7789
- else {
7790
- const returnType = getReturnTypeOfSignature(signature);
7791
- if (returnType && !(suppressAny && isTypeAny(returnType))) {
7792
- returnTypeNode = serializeReturnTypeForSignature(context, returnType, signature, options?.privateSymbolVisitor, options?.bundledImports);
7793
- }
7794
- else if (!suppressAny) {
7795
- returnTypeNode = factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
7796
- }
7797
- }
7798
7789
let modifiers = options?.modifiers;
7799
7790
if ((kind === SyntaxKind.ConstructorType) && signature.flags & SignatureFlags.Abstract) {
7800
7791
const flags = modifiersToFlags(modifiers);
@@ -8572,7 +8563,25 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
8572
8563
return false;
8573
8564
}
8574
8565
8575
- function serializeReturnTypeForSignature(context: NodeBuilderContext, type: Type, signature: Signature, includePrivateSymbol?: (s: Symbol) => void, bundled?: boolean) {
8566
+ function serializeReturnTypeForSignature(context: NodeBuilderContext, signature: Signature, includePrivateSymbol?: (s: Symbol) => void, bundled?: boolean) {
8567
+ const suppressAny = context.flags & NodeBuilderFlags.SuppressAnyReturnType;
8568
+ const flags = context.flags;
8569
+ if (suppressAny) context.flags &= ~NodeBuilderFlags.SuppressAnyReturnType; // suppress only toplevel `any`s
8570
+ let returnTypeNode: TypeNode | undefined;
8571
+ const returnType = getReturnTypeOfSignature(signature);
8572
+ if (returnType && !(suppressAny && isTypeAny(returnType))) {
8573
+ returnTypeNode = serializeReturnTypeForSignatureWorker(context, signature, includePrivateSymbol, bundled);
8574
+ }
8575
+ else if (!suppressAny) {
8576
+ returnTypeNode = factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
8577
+ }
8578
+ context.flags = flags;
8579
+ return returnTypeNode;
8580
+ }
8581
+
8582
+ function serializeReturnTypeForSignatureWorker(context: NodeBuilderContext, signature: Signature, includePrivateSymbol?: (s: Symbol) => void, bundled?: boolean) {
8583
+ const typePredicate = getTypePredicateOfSignature(signature);
8584
+ const type = getReturnTypeOfSignature(signature);
8576
8585
if (!isErrorType(type) && context.enclosingDeclaration) {
8577
8586
const annotation = signature.declaration && getEffectiveReturnTypeNode(signature.declaration);
8578
8587
const enclosingDeclarationIgnoringFakeScope = getEnclosingDeclarationIgnoringFakeScope(context.enclosingDeclaration);
@@ -8585,7 +8594,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
8585
8594
}
8586
8595
}
8587
8596
}
8588
- return typeToTypeNodeHelper(type, context);
8597
+ if (typePredicate) {
8598
+ return typePredicateToTypePredicateNodeHelper(typePredicate, context);
8599
+ }
8600
+ const expr = signature.declaration && getPossibleTypeNodeReuseExpression(signature.declaration);
8601
+ return expressionOrTypeToTypeNode(context, expr, type);
8589
8602
}
8590
8603
8591
8604
function trackExistingEntityName<T extends EntityNameOrEntityNameExpression>(node: T, context: NodeBuilderContext, includePrivateSymbol?: (s: Symbol) => void) {
@@ -8633,7 +8646,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
8633
8646
}
8634
8647
return transformed === existing ? setTextRange(factory.cloneNode(existing), existing) : transformed;
8635
8648
8636
- function visitExistingNodeTreeSymbols(node: Node): Node {
8649
+ function visitExistingNodeTreeSymbols(node: Node): Node | undefined {
8637
8650
// We don't _actually_ support jsdoc namepath types, emit `any` instead
8638
8651
if (isJSDocAllType(node) || node.kind === SyntaxKind.JSDocNamepathType) {
8639
8652
return factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
@@ -8642,16 +8655,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
8642
8655
return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
8643
8656
}
8644
8657
if (isJSDocNullableType(node)) {
8645
- return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode), factory.createLiteralTypeNode(factory.createNull())]);
8658
+ return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode)! , factory.createLiteralTypeNode(factory.createNull())]);
8646
8659
}
8647
8660
if (isJSDocOptionalType(node)) {
8648
- return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode), factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword)]);
8661
+ return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode)! , factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword)]);
8649
8662
}
8650
8663
if (isJSDocNonNullableType(node)) {
8651
8664
return visitNode(node.type, visitExistingNodeTreeSymbols);
8652
8665
}
8653
8666
if (isJSDocVariadicType(node)) {
8654
- return factory.createArrayTypeNode(visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode));
8667
+ return factory.createArrayTypeNode(visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode)! );
8655
8668
}
8656
8669
if (isJSDocTypeLiteral(node)) {
8657
8670
return factory.createTypeLiteralNode(map(node.jsDocPropertyTags, t => {
@@ -8743,15 +8756,24 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
8743
8756
node.isTypeOf,
8744
8757
);
8745
8758
}
8746
- if (isParameter(node)) {
8747
- if (!node.type && !node.initializer) {
8748
- return factory.updateParameterDeclaration(node, /*modifiers*/ undefined, node.dotDotDotToken, visitEachChild(node.name, visitExistingNodeTreeSymbols, /*context*/ undefined), node.questionToken, factory.createKeywordTypeNode(SyntaxKind.AnyKeyword), /*initializer*/ undefined);
8749
- }
8759
+ if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.ComputedPropertyName && !isLateBindableName(node.name)) {
8760
+ return undefined;
8750
8761
}
8751
- if (isPropertySignature(node)) {
8752
- if (!node.type && !node.initializer) {
8753
- return factory.updatePropertySignature(node, node.modifiers, node.name, node.questionToken, factory.createKeywordTypeNode(SyntaxKind.AnyKeyword));
8762
+ if (
8763
+ (isFunctionLike(node) && !node.type)
8764
+ || (isPropertyDeclaration(node) && !node.type && !node.initializer)
8765
+ || (isPropertySignature(node) && !node.type && !node.initializer)
8766
+ || (isParameter(node) && !node.type && !node.initializer)
8767
+ ) {
8768
+ let visited = visitEachChild(node, visitExistingNodeTreeSymbols, /*context*/ undefined);
8769
+ if (visited === node) {
8770
+ visited = setTextRange(factory.cloneNode(node), node);
8754
8771
}
8772
+ (visited as Mutable<typeof visited>).type = factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
8773
+ if (isParameter(node)) {
8774
+ (visited as Mutable<ParameterDeclaration>).modifiers = undefined;
8775
+ }
8776
+ return visited;
8755
8777
}
8756
8778
8757
8779
if (isEntityName(node) || isEntityNameExpression(node)) {
@@ -48676,6 +48698,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
48676
48698
48677
48699
type DeclarationWithPotentialInnerNodeReuse =
48678
48700
| SignatureDeclaration
48701
+ | JSDocSignature
48679
48702
| AccessorDeclaration
48680
48703
| VariableLikeDeclaration
48681
48704
| PropertyAccessExpression
@@ -48724,13 +48747,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
48724
48747
if (!signatureDeclaration) {
48725
48748
return factory.createToken(SyntaxKind.AnyKeyword) as KeywordTypeNode;
48726
48749
}
48727
- const signature = getSignatureFromDeclaration(signatureDeclaration);
48728
- const typePredicate = getTypePredicateOfSignature(signature);
48729
- if (typePredicate) {
48730
- // Inferred type predicates
48731
- return nodeBuilder.typePredicateToTypePredicateNode(typePredicate, enclosingDeclaration, flags | NodeBuilderFlags.MultilineObjectLiterals, tracker);
48732
- }
48733
- return nodeBuilder.expressionOrTypeToTypeNode(getPossibleTypeNodeReuseExpression(signatureDeclaration), getReturnTypeOfSignature(signature), /*addUndefined*/ undefined, enclosingDeclaration, flags | NodeBuilderFlags.MultilineObjectLiterals, tracker);
48750
+ return nodeBuilder.serializeReturnTypeForSignature(getSignatureFromDeclaration(signatureDeclaration), enclosingDeclaration, flags | NodeBuilderFlags.MultilineObjectLiterals, tracker);
48734
48751
}
48735
48752
48736
48753
function createTypeOfExpression(exprIn: Expression, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker) {
0 commit comments