@@ -2825,6 +2825,17 @@ namespace ts {
2825
2825
2826
2826
function symbolToParameterDeclaration(parameterSymbol: Symbol, context: NodeBuilderContext): ParameterDeclaration {
2827
2827
const parameterDeclaration = getDeclarationOfKind<ParameterDeclaration>(parameterSymbol, SyntaxKind.Parameter);
2828
+ if (isTransientSymbol(parameterSymbol) && parameterSymbol.isRestParameter) {
2829
+ // special-case synthetic rest parameters in JS files
2830
+ return createParameter(
2831
+ /*decorators*/ undefined,
2832
+ /*modifiers*/ undefined,
2833
+ parameterSymbol.isRestParameter ? createToken(SyntaxKind.DotDotDotToken) : undefined,
2834
+ "args",
2835
+ /*questionToken*/ undefined,
2836
+ typeToTypeNodeHelper(anyArrayType, context),
2837
+ /*initializer*/ undefined);
2838
+ }
2828
2839
const modifiers = parameterDeclaration.modifiers && parameterDeclaration.modifiers.map(getSynthesizedClone);
2829
2840
const dotDotDotToken = isRestParameter(parameterDeclaration) ? createToken(SyntaxKind.DotDotDotToken) : undefined;
2830
2841
const name = parameterDeclaration.name ?
@@ -6384,8 +6395,17 @@ namespace ts {
6384
6395
const typePredicate = declaration.type && declaration.type.kind === SyntaxKind.TypePredicate ?
6385
6396
createTypePredicateFromTypePredicateNode(declaration.type as TypePredicateNode) :
6386
6397
undefined;
6398
+ // JS functions get a free rest parameter if they reference `arguments`
6399
+ let hasRestLikeParameter = hasRestParameter(declaration);
6400
+ if (!hasRestLikeParameter && isInJavaScriptFile(declaration) && !hasJSDocParameterTags(declaration) && containsArgumentsReference(declaration)) {
6401
+ hasRestLikeParameter = true;
6402
+ const syntheticArgsSymbol = createSymbol(SymbolFlags.Variable, "args");
6403
+ syntheticArgsSymbol.type = anyArrayType;
6404
+ syntheticArgsSymbol.isRestParameter = true;
6405
+ parameters.push(syntheticArgsSymbol);
6406
+ }
6387
6407
6388
- links.resolvedSignature = createSignature(declaration, typeParameters, thisParameter, parameters, returnType, typePredicate, minArgumentCount, hasRestParameter(declaration) , hasLiteralTypes);
6408
+ links.resolvedSignature = createSignature(declaration, typeParameters, thisParameter, parameters, returnType, typePredicate, minArgumentCount, hasRestLikeParameter , hasLiteralTypes);
6389
6409
}
6390
6410
return links.resolvedSignature;
6391
6411
}
@@ -6420,14 +6440,14 @@ namespace ts {
6420
6440
}
6421
6441
}
6422
6442
6423
- function containsArgumentsReference(declaration: FunctionLikeDeclaration ): boolean {
6443
+ function containsArgumentsReference(declaration: SignatureDeclaration ): boolean {
6424
6444
const links = getNodeLinks(declaration);
6425
6445
if (links.containsArgumentsReference === undefined) {
6426
6446
if (links.flags & NodeCheckFlags.CaptureArguments) {
6427
6447
links.containsArgumentsReference = true;
6428
6448
}
6429
6449
else {
6430
- links.containsArgumentsReference = traverse(declaration.body);
6450
+ links.containsArgumentsReference = traverse(( declaration as FunctionLikeDeclaration) .body);
6431
6451
}
6432
6452
}
6433
6453
return links.containsArgumentsReference;
@@ -15482,21 +15502,6 @@ namespace ts {
15482
15502
}
15483
15503
}
15484
15504
15485
- if (signatures.length === 1) {
15486
- const declaration = signatures[0].declaration;
15487
- if (declaration && isInJavaScriptFile(declaration) && !hasJSDocParameterTags(declaration)) {
15488
- if (containsArgumentsReference(<FunctionLikeDeclaration>declaration)) {
15489
- const signatureWithRest = cloneSignature(signatures[0]);
15490
- const syntheticArgsSymbol = createSymbol(SymbolFlags.Variable, "args");
15491
- syntheticArgsSymbol.type = anyArrayType;
15492
- syntheticArgsSymbol.isRestParameter = true;
15493
- signatureWithRest.parameters = concatenate(signatureWithRest.parameters, [syntheticArgsSymbol]);
15494
- signatureWithRest.hasRestParameter = true;
15495
- signatures = [signatureWithRest];
15496
- }
15497
- }
15498
- }
15499
-
15500
15505
const candidates = candidatesOutArray || [];
15501
15506
// reorderCandidates fills up the candidates array directly
15502
15507
reorderCandidates(signatures, candidates);
0 commit comments