mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-30 01:04:49 -05:00
fix(38815): dive in arrow functions to check only this usage instead of checking all statements (#38865)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
23
tests/cases/fourslash/extract-method40.ts
Normal file
23
tests/cases/fourslash/extract-method40.ts
Normal 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; }
|
||||
};
|
||||
}
|
||||
`
|
||||
});
|
||||
20
tests/cases/fourslash/extract-method41.ts
Normal file
20
tests/cases/fourslash/extract-method41.ts
Normal 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");
|
||||
Reference in New Issue
Block a user