@@ -2832,6 +2832,17 @@ namespace ts {
28322832
28332833 function symbolToParameterDeclaration(parameterSymbol: Symbol, context: NodeBuilderContext): ParameterDeclaration {
28342834 const parameterDeclaration = getDeclarationOfKind<ParameterDeclaration>(parameterSymbol, SyntaxKind.Parameter);
2835+ if (isTransientSymbol(parameterSymbol) && parameterSymbol.isRestParameter) {
2836+ // special-case synthetic rest parameters in JS files
2837+ return createParameter(
2838+ /*decorators*/ undefined,
2839+ /*modifiers*/ undefined,
2840+ parameterSymbol.isRestParameter ? createToken(SyntaxKind.DotDotDotToken) : undefined,
2841+ "args",
2842+ /*questionToken*/ undefined,
2843+ typeToTypeNodeHelper(anyArrayType, context),
2844+ /*initializer*/ undefined);
2845+ }
28352846 const modifiers = parameterDeclaration.modifiers && parameterDeclaration.modifiers.map(getSynthesizedClone);
28362847 const dotDotDotToken = isRestParameter(parameterDeclaration) ? createToken(SyntaxKind.DotDotDotToken) : undefined;
28372848 const name = parameterDeclaration.name ?
@@ -6391,8 +6402,17 @@ namespace ts {
63916402 const typePredicate = declaration.type && declaration.type.kind === SyntaxKind.TypePredicate ?
63926403 createTypePredicateFromTypePredicateNode(declaration.type as TypePredicateNode) :
63936404 undefined;
6405+ // JS functions get a free rest parameter if they reference `arguments`
6406+ let hasRestLikeParameter = hasRestParameter(declaration);
6407+ if (!hasRestLikeParameter && isInJavaScriptFile(declaration) && !hasJSDocParameterTags(declaration) && containsArgumentsReference(declaration)) {
6408+ hasRestLikeParameter = true;
6409+ const syntheticArgsSymbol = createSymbol(SymbolFlags.Variable, "args");
6410+ syntheticArgsSymbol.type = anyArrayType;
6411+ syntheticArgsSymbol.isRestParameter = true;
6412+ parameters.push(syntheticArgsSymbol);
6413+ }
63946414
6395- links.resolvedSignature = createSignature(declaration, typeParameters, thisParameter, parameters, returnType, typePredicate, minArgumentCount, hasRestParameter(declaration) , hasLiteralTypes);
6415+ links.resolvedSignature = createSignature(declaration, typeParameters, thisParameter, parameters, returnType, typePredicate, minArgumentCount, hasRestLikeParameter , hasLiteralTypes);
63966416 }
63976417 return links.resolvedSignature;
63986418 }
@@ -6427,14 +6447,14 @@ namespace ts {
64276447 }
64286448 }
64296449
6430- function containsArgumentsReference(declaration: FunctionLikeDeclaration ): boolean {
6450+ function containsArgumentsReference(declaration: SignatureDeclaration ): boolean {
64316451 const links = getNodeLinks(declaration);
64326452 if (links.containsArgumentsReference === undefined) {
64336453 if (links.flags & NodeCheckFlags.CaptureArguments) {
64346454 links.containsArgumentsReference = true;
64356455 }
64366456 else {
6437- links.containsArgumentsReference = traverse(declaration.body);
6457+ links.containsArgumentsReference = traverse(( declaration as FunctionLikeDeclaration) .body);
64386458 }
64396459 }
64406460 return links.containsArgumentsReference;
@@ -15501,21 +15521,6 @@ namespace ts {
1550115521 }
1550215522 }
1550315523
15504- if (signatures.length === 1) {
15505- const declaration = signatures[0].declaration;
15506- if (declaration && isInJavaScriptFile(declaration) && !hasJSDocParameterTags(declaration)) {
15507- if (containsArgumentsReference(<FunctionLikeDeclaration>declaration)) {
15508- const signatureWithRest = cloneSignature(signatures[0]);
15509- const syntheticArgsSymbol = createSymbol(SymbolFlags.Variable, "args");
15510- syntheticArgsSymbol.type = anyArrayType;
15511- syntheticArgsSymbol.isRestParameter = true;
15512- signatureWithRest.parameters = concatenate(signatureWithRest.parameters, [syntheticArgsSymbol]);
15513- signatureWithRest.hasRestParameter = true;
15514- signatures = [signatureWithRest];
15515- }
15516- }
15517- }
15518-
1551915524 const candidates = candidatesOutArray || [];
1552015525 // reorderCandidates fills up the candidates array directly
1552115526 reorderCandidates(signatures, candidates);
0 commit comments