Skip to content

Commit 8915cb9

Browse files
author
Arthur Ozga
committed
Split signature factory methods
1 parent dfb4df9 commit 8915cb9

File tree

3 files changed

+79
-27
lines changed

3 files changed

+79
-27
lines changed

src/compiler/factory.ts

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -378,28 +378,65 @@ namespace ts {
378378
}
379379

380380
// TODO: Split according to AST nodes.
381-
export function createSignatureDeclaration<T extends SignatureDeclaration>(kind: SyntaxKind, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined): T;
382-
export function createSignatureDeclaration<T extends SignatureDeclaration & TypeElement>(kind: SyntaxKind, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined, name: string | PropertyName, questionToken: QuestionToken | undefined): T;
383-
export function createSignatureDeclaration<T extends SignatureDeclaration & TypeElement>(kind: SyntaxKind, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined, name?: string | PropertyName, questionToken?: QuestionToken): T {
384-
const signatureDeclaration = createSynthesizedNode(kind) as T;
381+
export function createSignatureDeclaration(kind: SyntaxKind, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined) {
382+
const signatureDeclaration = createSynthesizedNode(kind) as SignatureDeclaration;
385383
signatureDeclaration.typeParameters = asNodeArray(typeParameters);
386384
signatureDeclaration.parameters = asNodeArray(parameters);
387385
signatureDeclaration.type = type;
388-
signatureDeclaration.name = asName(name);
389-
signatureDeclaration.questionToken = questionToken;
390386
return signatureDeclaration;
391387
}
392388

393-
// TODO: figure out right type annotation for this function.
394-
export function updateSignatureDeclaration<T extends SignatureDeclaration>(node: T, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): T;
395-
export function updateSignatureDeclaration<T extends SignatureDeclaration & TypeElement>(node: T, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined, name: PropertyName, questionToken: QuestionToken | undefined): T;
396-
export function updateSignatureDeclaration<T extends SignatureDeclaration & TypeElement>(node: T, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined, name?: PropertyName, questionToken?: QuestionToken): T {
389+
export function updateSignatureDeclaration(node: SignatureDeclaration, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined) {
390+
return node.typeParameters !== typeParameters
391+
|| node.parameters !== parameters
392+
|| node.type !== type
393+
? updateNode(createSignatureDeclaration(node.kind, typeParameters, parameters, type), node)
394+
: node;
395+
}
396+
397+
export function createFunctionTypeNode(typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined): FunctionTypeNode {
398+
return createSignatureDeclaration(SyntaxKind.FunctionType, typeParameters, parameters, type) as FunctionTypeNode;
399+
}
400+
401+
export function updateFunctionTypeNode(node: FunctionTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): FunctionTypeNode {
402+
return <FunctionTypeNode>updateSignatureDeclaration(node, typeParameters, parameters, type);
403+
}
404+
405+
export function createConstructorTypeNode(typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined): ConstructorTypeNode {
406+
return createSignatureDeclaration(SyntaxKind.ConstructorType, typeParameters, parameters, type) as ConstructorTypeNode;
407+
}
408+
export function updateConstructorTypeNode(node: ConstructorTypeNode, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): ConstructorTypeNode {
409+
return <ConstructorTypeNode>updateSignatureDeclaration(node, typeParameters, parameters, type);
410+
}
411+
412+
export function createCallSignatureDeclaration(typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined): CallSignatureDeclaration {
413+
return createSignatureDeclaration(SyntaxKind.CallSignature, typeParameters, parameters, type) as CallSignatureDeclaration;
414+
}
415+
export function updateCallSignatureDeclaration(node: CallSignatureDeclaration, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): CallSignatureDeclaration {
416+
return <CallSignatureDeclaration>updateSignatureDeclaration(node, typeParameters, parameters, type);
417+
}
418+
419+
export function createConstructSignatureDeclaration(typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined): ConstructSignatureDeclaration {
420+
return createSignatureDeclaration(SyntaxKind.ConstructSignature, typeParameters, parameters, type) as ConstructSignatureDeclaration;
421+
}
422+
export function updateConstructSignatureDeclaration(node: ConstructSignatureDeclaration, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined): ConstructSignatureDeclaration {
423+
return <ConstructSignatureDeclaration>updateSignatureDeclaration(node, typeParameters, parameters, type);
424+
}
425+
426+
export function createMethodSignature(typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined, name: string | PropertyName, questionToken: QuestionToken | undefined): MethodSignature{
427+
const methodSignature = createSignatureDeclaration(SyntaxKind.MethodSignature, typeParameters, parameters, type) as MethodSignature;
428+
methodSignature.name = asName(name);
429+
methodSignature.questionToken = questionToken;
430+
return methodSignature;
431+
}
432+
433+
export function updateMethodSignature(node: MethodSignature, typeParameters: NodeArray<TypeParameterDeclaration> | undefined, parameters: NodeArray<ParameterDeclaration>, type: TypeNode | undefined, name?: PropertyName, questionToken?: QuestionToken): MethodSignature {
397434
return node.typeParameters !== typeParameters
398435
|| node.parameters !== parameters
399436
|| node.type !== type
400437
|| node.name !== name
401438
|| node.questionToken !== questionToken
402-
? updateNode(createSignatureDeclaration<T>(node.kind, typeParameters, parameters, type, name, questionToken), node)
439+
? updateNode(createMethodSignature(typeParameters, parameters, type, name, questionToken), node)
403440
: node;
404441
}
405442

@@ -502,7 +539,7 @@ namespace ts {
502539
: node;
503540
}
504541

505-
export function createMethod(decorators: Decorator[] | undefined, modifiers: Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | PropertyName, questionToken: QuestionToken | undefined, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined) {
542+
export function createMethodDeclaration(decorators: Decorator[] | undefined, modifiers: Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | PropertyName, questionToken: QuestionToken | undefined, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined) {
506543
const node = <MethodDeclaration>createSynthesizedNode(SyntaxKind.MethodDeclaration);
507544
node.decorators = asNodeArray(decorators);
508545
node.modifiers = asNodeArray(modifiers);
@@ -525,7 +562,7 @@ namespace ts {
525562
|| node.parameters !== parameters
526563
|| node.type !== type
527564
|| node.body !== body
528-
? updateNode(createMethod(decorators, modifiers, asteriskToken, name, questionToken, typeParameters, parameters, type, body), node)
565+
? updateNode(createMethodDeclaration(decorators, modifiers, asteriskToken, name, questionToken, typeParameters, parameters, type, body), node)
529566
: node;
530567
}
531568

src/compiler/visitor.ts

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -260,21 +260,36 @@ namespace ts {
260260

261261
// Signatures and Signature Elements
262262
case SyntaxKind.FunctionType:
263+
return updateFunctionTypeNode(<FunctionTypeNode>node,
264+
nodesVisitor((<FunctionTypeNode>node).typeParameters, visitor, isTypeParameter),
265+
visitParameterList((<FunctionTypeNode>node).parameters, visitor, context, nodesVisitor),
266+
visitNode((<FunctionTypeNode>node).type, visitor, isTypeNode));
267+
263268
case SyntaxKind.ConstructorType:
269+
return updateConstructorTypeNode(<ConstructorTypeNode>node,
270+
nodesVisitor((<ConstructorTypeNode>node).typeParameters, visitor, isTypeParameter),
271+
visitParameterList((<ConstructorTypeNode>node).parameters, visitor, context, nodesVisitor),
272+
visitNode((<ConstructorTypeNode>node).type, visitor, isTypeNode));
273+
264274
case SyntaxKind.CallSignature:
275+
return updateCallSignatureDeclaration(<CallSignatureDeclaration>node,
276+
nodesVisitor((<CallSignatureDeclaration>node).typeParameters, visitor, isTypeParameter),
277+
visitParameterList((<CallSignatureDeclaration>node).parameters, visitor, context, nodesVisitor),
278+
visitNode((<CallSignatureDeclaration>node).type, visitor, isTypeNode));
279+
265280
case SyntaxKind.ConstructSignature:
266-
return updateSignatureDeclaration(<SignatureDeclaration>node,
267-
nodesVisitor((<SignatureDeclaration>node).typeParameters, visitor, isTypeParameter),
268-
visitParameterList((<SignatureDeclaration>node).parameters, visitor, context, nodesVisitor),
269-
visitNode((<SignatureDeclaration>node).type, visitor, isTypeNode));
281+
return updateConstructSignatureDeclaration(<ConstructSignatureDeclaration>node,
282+
nodesVisitor((<ConstructSignatureDeclaration>node).typeParameters, visitor, isTypeParameter),
283+
visitParameterList((<ConstructSignatureDeclaration>node).parameters, visitor, context, nodesVisitor),
284+
visitNode((<ConstructSignatureDeclaration>node).type, visitor, isTypeNode));
270285

271286
case SyntaxKind.MethodSignature:
272-
return updateSignatureDeclaration(<SignatureDeclaration & TypeElement>node,
273-
nodesVisitor((<SignatureDeclaration & TypeElement>node).typeParameters, visitor, isTypeParameter),
274-
visitParameterList((<SignatureDeclaration & TypeElement>node).parameters, visitor, context, nodesVisitor),
275-
visitNode((<SignatureDeclaration & TypeElement>node).type, visitor, isTypeNode),
276-
visitNode((<SignatureDeclaration & TypeElement>node).name, visitor, isPropertyName),
277-
visitNode((<SignatureDeclaration & TypeElement>node).questionToken, tokenVisitor, isToken));
287+
return updateMethodSignature(<MethodSignature>node,
288+
nodesVisitor((<MethodSignature>node).typeParameters, visitor, isTypeParameter),
289+
visitParameterList((<MethodSignature>node).parameters, visitor, context, nodesVisitor),
290+
visitNode((<MethodSignature>node).type, visitor, isTypeNode),
291+
visitNode((<MethodSignature>node).name, visitor, isPropertyName),
292+
visitNode((<MethodSignature>node).questionToken, tokenVisitor, isToken));
278293

279294
case SyntaxKind.IndexSignature:
280295
return updateIndexSignatureDeclaration(<IndexSignatureDeclaration>node,

src/services/codefixes/helpers.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ namespace ts.codefix {
100100
if (declarations.length === 1) {
101101
Debug.assert(signatures.length === 1);
102102
const signature = signatures[0];
103-
const signatureDeclaration = checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration) as MethodDeclaration;
103+
const signatureDeclaration = <MethodDeclaration>checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration);
104104
signatureDeclaration.modifiers = modifiers;
105105
signatureDeclaration.name = name;
106106
signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined;
@@ -111,7 +111,7 @@ namespace ts.codefix {
111111
let signatureDeclarations = [];
112112
for (let i = 0; i < signatures.length; i++) {
113113
const signature = signatures[i];
114-
const signatureDeclaration = checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration) as MethodDeclaration;
114+
const signatureDeclaration = <MethodDeclaration>checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration);
115115
signatureDeclaration.modifiers = modifiers;
116116
signatureDeclaration.name = name;
117117
signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined;
@@ -120,7 +120,7 @@ namespace ts.codefix {
120120

121121
if (declarations.length > signatures.length) {
122122
let signature = checker.getSignatureFromDeclaration(declarations[declarations.length - 1] as SignatureDeclaration);
123-
const signatureDeclaration = checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration) as MethodDeclaration;
123+
const signatureDeclaration = <MethodDeclaration>checker.signatureToSignatureDeclaration(signature, SyntaxKind.MethodDeclaration, enclosingDeclaration);
124124
signatureDeclaration.modifiers = modifiers;
125125
signatureDeclaration.name = name;
126126
signatureDeclaration.questionToken = optional ? createToken(SyntaxKind.QuestionToken) : undefined;
@@ -197,7 +197,7 @@ namespace ts.codefix {
197197
}
198198

199199
export function createStubbedMethod(modifiers: Modifier[], name: PropertyName, optional: boolean, typeParameters: TypeParameterDeclaration[] | undefined, parameters: ParameterDeclaration[], returnType: TypeNode | undefined) {
200-
return createMethod(
200+
return createMethodDeclaration(
201201
/*decorators*/ undefined,
202202
modifiers,
203203
/*asteriskToken*/ undefined,

0 commit comments

Comments
 (0)