fix(38815): dive in arrow functions to check only this usage instead of checking all statements (#38865)

This commit is contained in:
Alexander T
2020-06-01 20:27:11 +03:00
committed by GitHub
parent b944ce557c
commit 68d2ee055c
3 changed files with 58 additions and 1 deletions

View File

@@ -405,6 +405,20 @@ namespace ts.refactor.extractSymbol {
rangeFacts |= RangeFacts.UsesThis;
}
break;
case SyntaxKind.ArrowFunction:
// check if arrow function uses this
forEachChild(node, function check(n) {
if (isThis(n)) {
rangeFacts |= RangeFacts.UsesThis;
}
else if (isClassLike(n) || (isFunctionLike(n) && !isArrowFunction(n))) {
return false;
}
else {
forEachChild(n, check);
}
});
// falls through
case SyntaxKind.ClassDeclaration:
case SyntaxKind.FunctionDeclaration:
if (isSourceFile(node.parent) && node.parent.externalModuleIndicator === undefined) {
@@ -418,7 +432,7 @@ namespace ts.refactor.extractSymbol {
case SyntaxKind.Constructor:
case SyntaxKind.GetAccessor:
case SyntaxKind.SetAccessor:
// do not dive into functions (except arrow functions) or classes
// do not dive into functions or classes
return false;
}

View File

@@ -0,0 +1,23 @@
/// <reference path='fourslash.ts' />
////const foo = /*start*/{
//// a: 1,
//// b: () => { return 1; }
////}/*end*/
goTo.select("start", "end");
edit.applyRefactor({
refactorName: "Extract Symbol",
actionName: "function_scope_0",
actionDescription: "Extract to function in global scope",
newContent:
`const foo = /*RENAME*/newFunction()
function newFunction() {
return {
a: 1,
b: () => { return 1; }
};
}
`
});

View File

@@ -0,0 +1,20 @@
/// <reference path='fourslash.ts' />
////function bar(fn: () => void) {}
////
////class Foo {
//// x: number;
//// foo() {
//// /*start*/bar(() => {
//// () => {
//// () => {
//// this.x;
//// }
//// }
//// });/*end*/
//// }
////}
goTo.select("start", "end");
verify.refactorAvailable("Extract Symbol", "function_scope_1");
verify.not.refactorAvailable("Extract Symbol", "function_scope_2");