fix(45102): do not suggest refactoring for functions contains arguments reference (#45116)

This commit is contained in:
Oleksandr T 2021-08-03 21:31:56 +03:00 committed by GitHub
parent 5a2153a729
commit c4080437b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 2 deletions

View File

@ -555,6 +555,7 @@ namespace ts {
getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.IsForSignatureHelp),
getExpandedParameters,
hasEffectiveRestParameter,
containsArgumentsReference,
getConstantValue: nodeIn => {
const node = getParseTreeNode(nodeIn, canHaveConstantValue);
return node ? getConstantValue(node) : undefined;

View File

@ -4205,6 +4205,8 @@ namespace ts {
/* @internal */ getResolvedSignatureForSignatureHelp(node: CallLikeExpression, candidatesOutArray?: Signature[], argumentCount?: number): Signature | undefined;
/* @internal */ getExpandedParameters(sig: Signature): readonly (readonly Symbol[])[];
/* @internal */ hasEffectiveRestParameter(sig: Signature): boolean;
/* @internal */ containsArgumentsReference(declaration: SignatureDeclaration): boolean;
getSignatureFromDeclaration(declaration: SignatureDeclaration): Signature | undefined;
isImplementationOfOverload(node: SignatureDeclaration): boolean | undefined;
isUndefinedSymbol(symbol: Symbol): boolean;

View File

@ -141,7 +141,7 @@ namespace ts.refactor.convertArrowFunctionOrFunctionExpression {
const token = getTokenAtPosition(file, startPosition);
const typeChecker = program.getTypeChecker();
const func = tryGetFunctionFromVariableDeclaration(file, typeChecker, token.parent);
if (func && !containingThis(func.body)) {
if (func && !containingThis(func.body) && !typeChecker.containsArgumentsReference(func)) {
return { selectedVariableDeclaration: true, func };
}
@ -150,7 +150,8 @@ namespace ts.refactor.convertArrowFunctionOrFunctionExpression {
maybeFunc &&
(isFunctionExpression(maybeFunc) || isArrowFunction(maybeFunc)) &&
!rangeContainsRange(maybeFunc.body, token) &&
!containingThis(maybeFunc.body)
!containingThis(maybeFunc.body) &&
!typeChecker.containsArgumentsReference(maybeFunc)
) {
if (isFunctionExpression(maybeFunc) && isFunctionReferencedInFile(file, typeChecker, maybeFunc)) return undefined;
return { selectedVariableDeclaration: false, func: maybeFunc };

View File

@ -0,0 +1,10 @@
/// <reference path='fourslash.ts' />
////function foo() {
//// return /*a*/(/*b*/) => arguments;
////}
goTo.select("a", "b");
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to named function");
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to anonymous function");
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to arrow function");

View File

@ -0,0 +1,10 @@
/// <reference path='fourslash.ts' />
////function foo() {
//// return /*a*/f/*b*/unction () { arguments }
////}
goTo.select("a", "b");
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to named function");
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to anonymous function");
verify.not.refactorAvailable("Convert arrow function or function expression", "Convert to arrow function");