diff --git a/src/services/refactors/extractSymbol.ts b/src/services/refactors/extractSymbol.ts
index 64e9bb6f3a2c8..0e5034ff84375 100644
--- a/src/services/refactors/extractSymbol.ts
+++ b/src/services/refactors/extractSymbol.ts
@@ -405,24 +405,24 @@ namespace ts.refactor.extractSymbol {
rangeFacts |= RangeFacts.UsesThis;
}
break;
+ case SyntaxKind.ClassDeclaration:
+ case SyntaxKind.FunctionDeclaration:
+ if (isSourceFile(node.parent) && node.parent.externalModuleIndicator === undefined) {
+ // You cannot extract global declarations
+ (errors || (errors = [] as Diagnostic[])).push(createDiagnosticForNode(node, Messages.functionWillNotBeVisibleInTheNewScope));
+ }
+ // falls through
+ case SyntaxKind.ClassExpression:
+ case SyntaxKind.FunctionExpression:
+ case SyntaxKind.MethodDeclaration:
+ case SyntaxKind.Constructor:
+ case SyntaxKind.GetAccessor:
+ case SyntaxKind.SetAccessor:
+ // do not dive into functions (except arrow functions) or classes
+ return false;
}
- if (isFunctionLikeDeclaration(node) || isClassLike(node)) {
- switch (node.kind) {
- case SyntaxKind.FunctionDeclaration:
- case SyntaxKind.ClassDeclaration:
- if (isSourceFile(node.parent) && node.parent.externalModuleIndicator === undefined) {
- // You cannot extract global declarations
- (errors || (errors = [] as Diagnostic[])).push(createDiagnosticForNode(node, Messages.functionWillNotBeVisibleInTheNewScope));
- }
- break;
- }
-
- // do not dive into functions or classes
- return false;
- }
const savedPermittedJumps = permittedJumps;
-
switch (node.kind) {
case SyntaxKind.IfStatement:
permittedJumps = PermittedJumps.None;
diff --git a/tests/cases/fourslash/extract-method38.ts b/tests/cases/fourslash/extract-method38.ts
new file mode 100644
index 0000000000000..075f08ec7f9cf
--- /dev/null
+++ b/tests/cases/fourslash/extract-method38.ts
@@ -0,0 +1,14 @@
+///
+
+////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");
diff --git a/tests/cases/fourslash/extract-method39.ts b/tests/cases/fourslash/extract-method39.ts
new file mode 100644
index 0000000000000..85b51dcd9c0c1
--- /dev/null
+++ b/tests/cases/fourslash/extract-method39.ts
@@ -0,0 +1,14 @@
+///
+
+////function bar(fn: () => void) {}
+////
+////class Foo {
+//// x: number;
+//// foo() {
+//// /*start*/bar(() => {});/*end*/
+//// }
+////}
+
+goTo.select("start", "end");
+verify.refactorAvailable("Extract Symbol", "function_scope_1");
+verify.refactorAvailable("Extract Symbol", "function_scope_2");