Skip to content

Commit ae7c638

Browse files
committed
Update function/constructor-type factories
1 parent 322515c commit ae7c638

File tree

7 files changed

+37
-33
lines changed

7 files changed

+37
-33
lines changed

src/compiler/checker.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -4461,8 +4461,8 @@ namespace ts {
44614461
kind === SyntaxKind.SetAccessor ? factory.createSetAccessorDeclaration(/*decorators*/ undefined, options?.modifiers, options?.name ?? factory.createIdentifier(""), parameters, /*body*/ undefined) :
44624462
kind === SyntaxKind.IndexSignature ? factory.createIndexSignature(/*decorators*/ undefined, options?.modifiers, parameters, returnTypeNode) :
44634463
kind === SyntaxKind.JSDocFunctionType ? factory.createJSDocFunctionType(parameters, returnTypeNode) :
4464-
kind === SyntaxKind.FunctionType ? factory.createFunctionTypeNode(typeParameters, parameters, returnTypeNode) :
4465-
kind === SyntaxKind.ConstructorType ? factory.createConstructorTypeNode(typeParameters, parameters, returnTypeNode) :
4464+
kind === SyntaxKind.FunctionType ? factory.createFunctionTypeNode(typeParameters, parameters, returnTypeNode ?? factory.createTypeReferenceNode(factory.createIdentifier(""))) :
4465+
kind === SyntaxKind.ConstructorType ? factory.createConstructorTypeNode(typeParameters, parameters, returnTypeNode ?? factory.createTypeReferenceNode(factory.createIdentifier(""))) :
44664466
kind === SyntaxKind.FunctionDeclaration ? factory.createFunctionDeclaration(/*decorators*/ undefined, options?.modifiers, /*asteriskToken*/ undefined, options?.name ? cast(options.name, isIdentifier) : factory.createIdentifier(""), typeParameters, parameters, returnTypeNode, /*body*/ undefined) :
44674467
kind === SyntaxKind.FunctionExpression ? factory.createFunctionExpression(options?.modifiers, /*asteriskToken*/ undefined, options?.name ? cast(options.name, isIdentifier) : factory.createIdentifier(""), typeParameters, parameters, returnTypeNode, factory.createBlock([])) :
44684468
kind === SyntaxKind.ArrowFunction ? factory.createArrowFunction(options?.modifiers, typeParameters, parameters, returnTypeNode, /*equalsGreaterThanToken*/ undefined, factory.createBlock([])) :
@@ -6075,7 +6075,7 @@ namespace ts {
60756075
visitNode(p.type, visitExistingNodeTreeSymbols),
60766076
/*initializer*/ undefined
60776077
)),
6078-
visitNode(newTypeNode || node.type, visitExistingNodeTreeSymbols)
6078+
visitNode(newTypeNode ?? node.type, visitExistingNodeTreeSymbols) ?? factory.createTypeReferenceNode(factory.createIdentifier(""))
60796079
);
60806080
}
60816081
else {
@@ -6090,7 +6090,7 @@ namespace ts {
60906090
visitNode(p.type, visitExistingNodeTreeSymbols),
60916091
/*initializer*/ undefined
60926092
)),
6093-
visitNode(node.type, visitExistingNodeTreeSymbols)
6093+
visitNode(node.type, visitExistingNodeTreeSymbols) ?? factory.createTypeReferenceNode(factory.createIdentifier(""))
60946094
);
60956095
}
60966096
}

src/compiler/factory/nodeFactory.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -4772,7 +4772,7 @@ namespace ts {
47724772
return array ? createNodeArray(array) : undefined;
47734773
}
47744774

4775-
function asName<T extends Identifier | BindingName | PropertyName | NoSubstitutionTemplateLiteral | EntityName | ThisTypeNode | undefined>(name: string | T): T | Identifier {
4775+
function asName<T extends DeclarationName | Identifier | BindingName | PropertyName | NoSubstitutionTemplateLiteral | EntityName | ThisTypeNode | undefined>(name: string | T): T | Identifier {
47764776
return typeof name === "string" ? createIdentifier(name) :
47774777
name;
47784778
}
@@ -4946,9 +4946,9 @@ namespace ts {
49464946
case SyntaxKind.JSDocFunctionType:
49474947
return factory.createJSDocFunctionType(parameters, type);
49484948
case SyntaxKind.FunctionType:
4949-
return factory.createFunctionTypeNode(typeParameters, parameters, type);
4949+
return factory.createFunctionTypeNode(typeParameters, parameters, Debug.assertDefined(type));
49504950
case SyntaxKind.ConstructorType:
4951-
return factory.createConstructorTypeNode(typeParameters, parameters, type);
4951+
return factory.createConstructorTypeNode(typeParameters, parameters, Debug.assertDefined(type));
49524952
case SyntaxKind.FunctionDeclaration:
49534953
return factory.createFunctionDeclaration(/*decorators*/ undefined, /*modifiers*/ undefined, /*asteriskToken*/ undefined, /*name*/ undefined, typeParameters, parameters, type, /*body*/ undefined);
49544954
case SyntaxKind.FunctionExpression:
@@ -5514,8 +5514,8 @@ namespace ts {
55145514
(node: Mutable<Node>) => { node.transformFlags |= transformFlags; };
55155515
}
55165516

5517-
function observeArguments<T>(action: <U extends T>(arg1: U, arg2: U) => U, observer: ((arg1: T, arg2: T) => void) | undefined): <U extends T>(arg1: U, arg2: U) => U;
5518-
function observeArguments<T, U, R>(action: (arg1: T, arg2: U | undefined) => R, observer: ((arg1: T, arg2: U) => void) | undefined): (arg1: T, arg2: U | undefined) => R;
5517+
function observeArguments<T, F extends <U extends T>(arg1: U, arg2: U) => U>(action: F, observer: ((arg1: T, arg2: T) => void) | undefined): F;
5518+
function observeArguments<T, U, R, F extends (arg1: T, arg2: U | undefined) => R>(action: F, observer: ((arg1: T, arg2: U) => void) | undefined): F;
55195519
function observeArguments<T, U, R>(action: (arg1: T, arg2: U) => R, observer: ((arg1: T, arg2: U) => void) | undefined): (arg1: T, arg2: U) => R {
55205520
return !observer ? action : (arg1, arg2) => {
55215521
if (arg2 !== undefined) {
@@ -5525,8 +5525,8 @@ namespace ts {
55255525
};
55265526
}
55275527

5528-
function observeResult<T>(action: <U extends T>(arg: U) => U, observer: ((result: T) => void) | undefined): <U extends T>(arg: U) => U;
5529-
function observeResult<T, R>(action: (arg: T) => R, observer: ((result: R) => void) | undefined): (arg: T) => R;
5528+
function observeResult<T, F extends <U extends T>(arg: U) => U>(action: F, observer: ((result: T) => void) | undefined): F;
5529+
function observeResult<T, R, F extends (arg: T) => R>(action: F, observer: ((result: R) => void) | undefined): F;
55305530
function observeResult<T, R>(action: (arg: T) => R, observer: ((result: R) => void) | undefined): (arg: T) => R {
55315531
return !observer ? action : arg => {
55325532
const result = action(arg);

src/compiler/parser.ts

+2
Original file line numberDiff line numberDiff line change
@@ -2670,6 +2670,8 @@ namespace ts {
26702670
);
26712671
}
26722672

2673+
function parseReturnType(returnToken: SyntaxKind.EqualsGreaterThanToken, isType: boolean): TypeNode;
2674+
function parseReturnType(returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken, isType: boolean): TypeNode | undefined;
26732675
function parseReturnType(returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken, isType: boolean) {
26742676
if (shouldParseReturnType(returnToken, isType)) {
26752677
return parseTypeOrTypePredicate();

src/compiler/types.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -3991,7 +3991,7 @@ namespace ts {
39913991
WriteTypeArgumentsOfSignature = 1 << 5, // Write the type arguments instead of type parameters of the signature
39923992
UseFullyQualifiedType = 1 << 6, // Write out the fully qualified type name (eg. Module.Type, instead of Type)
39933993
UseOnlyExternalAliasing = 1 << 7, // Only use external aliases for a symbol
3994-
SuppressAnyReturnType = 1 << 8, // If the return type is any-like, don't offer a return type.
3994+
SuppressAnyReturnType = 1 << 8, // If the return type is any-like and can be elided, don't offer a return type.
39953995
WriteTypeParametersInQualifiedName = 1 << 9,
39963996
MultilineObjectLiterals = 1 << 10, // Always write object literals across multiple lines
39973997
WriteClassExpressionAsTypeLiteral = 1 << 11, // Write class {} as { new(): {} } - used for mixin declaration emit
@@ -6398,10 +6398,10 @@ namespace ts {
63986398
updateTypePredicateNode(node: TypePredicateNode, assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode, type: TypeNode | undefined): TypePredicateNode;
63996399
createTypeReferenceNode(typeName: string | EntityName, typeArguments?: readonly TypeNode[]): TypeReferenceNode;
64006400
updateTypeReferenceNode(node: TypeReferenceNode, typeName: EntityName, typeArguments: NodeArray<TypeNode> | undefined): TypeReferenceNode;
6401-
createFunctionTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): FunctionTypeNode;
6402-
updateFunctionTypeNode(node: FunctionTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): FunctionTypeNode;
6403-
createConstructorTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): ConstructorTypeNode;
6404-
updateConstructorTypeNode(node: ConstructorTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): ConstructorTypeNode;
6401+
createFunctionTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): FunctionTypeNode;
6402+
updateFunctionTypeNode(node: FunctionTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode): FunctionTypeNode;
6403+
createConstructorTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): ConstructorTypeNode;
6404+
updateConstructorTypeNode(node: ConstructorTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode): ConstructorTypeNode;
64056405
createTypeQueryNode(exprName: EntityName): TypeQueryNode;
64066406
updateTypeQueryNode(node: TypeQueryNode, exprName: EntityName): TypeQueryNode;
64076407
createTypeLiteralNode(members: readonly TypeElement[] | undefined): TypeLiteralNode;

src/services/codefixes/annotateWithTypeFromJSDoc.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ namespace ts.codefix {
110110
}
111111

112112
function transformJSDocFunctionType(node: JSDocFunctionType) {
113-
return factory.createFunctionTypeNode(emptyArray, node.parameters.map(transformJSDocParameter), node.type);
113+
// TODO: This does not properly handle `function(new:C, string)` per https://github.com/google/closure-compiler/wiki/Types-in-the-Closure-Type-System#the-javascript-type-language
114+
// however we do handle it correctly in `serializeTypeForDeclaration` in checker.ts
115+
return factory.createFunctionTypeNode(emptyArray, node.parameters.map(transformJSDocParameter), node.type ?? factory.createKeywordTypeNode(SyntaxKind.AnyKeyword));
114116
}
115117

116118
function transformJSDocParameter(node: ParameterDeclaration) {

tests/baselines/reference/api/tsserverlibrary.d.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -3043,10 +3043,10 @@ declare namespace ts {
30433043
updateTypePredicateNode(node: TypePredicateNode, assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode, type: TypeNode | undefined): TypePredicateNode;
30443044
createTypeReferenceNode(typeName: string | EntityName, typeArguments?: readonly TypeNode[]): TypeReferenceNode;
30453045
updateTypeReferenceNode(node: TypeReferenceNode, typeName: EntityName, typeArguments: NodeArray<TypeNode> | undefined): TypeReferenceNode;
3046-
createFunctionTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): FunctionTypeNode;
3047-
updateFunctionTypeNode(node: FunctionTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): FunctionTypeNode;
3048-
createConstructorTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): ConstructorTypeNode;
3049-
updateConstructorTypeNode(node: ConstructorTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): ConstructorTypeNode;
3046+
createFunctionTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): FunctionTypeNode;
3047+
updateFunctionTypeNode(node: FunctionTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode): FunctionTypeNode;
3048+
createConstructorTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): ConstructorTypeNode;
3049+
updateConstructorTypeNode(node: ConstructorTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode): ConstructorTypeNode;
30503050
createTypeQueryNode(exprName: EntityName): TypeQueryNode;
30513051
updateTypeQueryNode(node: TypeQueryNode, exprName: EntityName): TypeQueryNode;
30523052
createTypeLiteralNode(members: readonly TypeElement[] | undefined): TypeLiteralNode;
@@ -9584,19 +9584,19 @@ declare namespace ts {
95849584
/**
95859585
* @deprecated Use `factory.createFunctionTypeNode` or the factory supplied by your transformation context instead.
95869586
*/
9587-
createFunctionTypeNode: (typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined) => FunctionTypeNode,
9587+
createFunctionTypeNode: (typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode) => FunctionTypeNode,
95889588
/**
95899589
* @deprecated Use `factory.updateFunctionTypeNode` or the factory supplied by your transformation context instead.
95909590
*/
9591-
updateFunctionTypeNode: (node: FunctionTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined) => FunctionTypeNode,
9591+
updateFunctionTypeNode: (node: FunctionTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode) => FunctionTypeNode,
95929592
/**
95939593
* @deprecated Use `factory.createConstructorTypeNode` or the factory supplied by your transformation context instead.
95949594
*/
9595-
createConstructorTypeNode: (typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined) => ConstructorTypeNode,
9595+
createConstructorTypeNode: (typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode) => ConstructorTypeNode,
95969596
/**
95979597
* @deprecated Use `factory.updateConstructorTypeNode` or the factory supplied by your transformation context instead.
95989598
*/
9599-
updateConstructorTypeNode: (node: ConstructorTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined) => ConstructorTypeNode,
9599+
updateConstructorTypeNode: (node: ConstructorTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode) => ConstructorTypeNode,
96009600
/**
96019601
* @deprecated Use `factory.createTypeQueryNode` or the factory supplied by your transformation context instead.
96029602
*/

0 commit comments

Comments
 (0)