Skip to content

Commit c408043

Browse files
authored
fix(45102): do not suggest refactoring for functions contains arguments reference (#45116)
1 parent 5a2153a commit c408043

5 files changed

+26
-2
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,7 @@ namespace ts {
555555
getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.IsForSignatureHelp),
556556
getExpandedParameters,
557557
hasEffectiveRestParameter,
558+
containsArgumentsReference,
558559
getConstantValue: nodeIn => {
559560
const node = getParseTreeNode(nodeIn, canHaveConstantValue);
560561
return node ? getConstantValue(node) : undefined;

src/compiler/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4205,6 +4205,8 @@ namespace ts {
42054205
/* @internal */ getResolvedSignatureForSignatureHelp(node: CallLikeExpression, candidatesOutArray?: Signature[], argumentCount?: number): Signature | undefined;
42064206
/* @internal */ getExpandedParameters(sig: Signature): readonly (readonly Symbol[])[];
42074207
/* @internal */ hasEffectiveRestParameter(sig: Signature): boolean;
4208+
/* @internal */ containsArgumentsReference(declaration: SignatureDeclaration): boolean;
4209+
42084210
getSignatureFromDeclaration(declaration: SignatureDeclaration): Signature | undefined;
42094211
isImplementationOfOverload(node: SignatureDeclaration): boolean | undefined;
42104212
isUndefinedSymbol(symbol: Symbol): boolean;

src/services/refactors/convertArrowFunctionOrFunctionExpression.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ namespace ts.refactor.convertArrowFunctionOrFunctionExpression {
141141
const token = getTokenAtPosition(file, startPosition);
142142
const typeChecker = program.getTypeChecker();
143143
const func = tryGetFunctionFromVariableDeclaration(file, typeChecker, token.parent);
144-
if (func && !containingThis(func.body)) {
144+
if (func && !containingThis(func.body) && !typeChecker.containsArgumentsReference(func)) {
145145
return { selectedVariableDeclaration: true, func };
146146
}
147147

@@ -150,7 +150,8 @@ namespace ts.refactor.convertArrowFunctionOrFunctionExpression {
150150
maybeFunc &&
151151
(isFunctionExpression(maybeFunc) || isArrowFunction(maybeFunc)) &&
152152
!rangeContainsRange(maybeFunc.body, token) &&
153-
!containingThis(maybeFunc.body)
153+
!containingThis(maybeFunc.body) &&
154+
!typeChecker.containsArgumentsReference(maybeFunc)
154155
) {
155156
if (isFunctionExpression(maybeFunc) && isFunctionReferencedInFile(file, typeChecker, maybeFunc)) return undefined;
156157
return { selectedVariableDeclaration: false, func: maybeFunc };
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////function foo() {
4+
//// return /*a*/(/*b*/) => arguments;
5+
////}
6+
7+
goTo.select("a", "b");
8+
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to named function");
9+
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to anonymous function");
10+
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to arrow function");
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////function foo() {
4+
//// return /*a*/f/*b*/unction () { arguments }
5+
////}
6+
7+
goTo.select("a", "b");
8+
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to named function");
9+
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to anonymous function");
10+
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to arrow function");

0 commit comments

Comments
 (0)