diff --git a/src/services/refactors/extractSymbol.ts b/src/services/refactors/extractSymbol.ts
index 6b2ec866f32..67435b47354 100644
--- a/src/services/refactors/extractSymbol.ts
+++ b/src/services/refactors/extractSymbol.ts
@@ -551,7 +551,7 @@ namespace ts.refactor.extractSymbol {
const savedPermittedJumps = permittedJumps;
switch (node.kind) {
case SyntaxKind.IfStatement:
- permittedJumps = PermittedJumps.None;
+ permittedJumps &= ~PermittedJumps.Return;
break;
case SyntaxKind.TryStatement:
// forbid all jumps inside try blocks
diff --git a/tests/cases/fourslash/extract-method45.ts b/tests/cases/fourslash/extract-method45.ts
new file mode 100644
index 00000000000..785f90dc387
--- /dev/null
+++ b/tests/cases/fourslash/extract-method45.ts
@@ -0,0 +1,54 @@
+///
+
+////export function fn(m: number) {
+//// const mode = m >= 0 ? "a" : "b";
+//// let result: number = 0;
+////
+//// if (mode === "a") {
+//// /*a*/for (let i = 0; i < 10; i++) {
+//// const rand = Math.random();
+//// if (rand > 0.5) {
+//// result = rand;
+//// break;
+//// }
+//// }/*b*/
+//// }
+//// else {
+//// result = 0;
+//// }
+////
+//// return result;
+////}
+
+goTo.select("a", "b");
+edit.applyRefactor({
+ refactorName: "Extract Symbol",
+ actionName: "function_scope_1",
+ actionDescription: "Extract to function in module scope",
+ newContent:
+`export function fn(m: number) {
+ const mode = m >= 0 ? "a" : "b";
+ let result: number = 0;
+
+ if (mode === "a") {
+ result = /*RENAME*/newFunction(result);
+ }
+ else {
+ result = 0;
+ }
+
+ return result;
+}
+
+function newFunction(result: number) {
+ for (let i = 0; i < 10; i++) {
+ const rand = Math.random();
+ if (rand > 0.5) {
+ result = rand;
+ break;
+ }
+ }
+ return result;
+}
+`
+});
diff --git a/tests/cases/fourslash/extract-method46.ts b/tests/cases/fourslash/extract-method46.ts
new file mode 100644
index 00000000000..71523a8bb62
--- /dev/null
+++ b/tests/cases/fourslash/extract-method46.ts
@@ -0,0 +1,54 @@
+///
+
+////export function fn(m: number, n: number) {
+//// const mode = m >= 0 ? "a" : "b";
+//// let result: number = 0;
+////
+//// if (mode === "a") {
+//// /*a*/for (let i = 0; i < n; i++) {
+//// const rand = Math.random();
+//// if (rand > 0.5) {
+//// result = rand;
+//// break;
+//// }
+//// }/*b*/
+//// }
+//// else {
+//// result = 0;
+//// }
+////
+//// return result;
+////}
+
+goTo.select("a", "b");
+edit.applyRefactor({
+ refactorName: "Extract Symbol",
+ actionName: "function_scope_1",
+ actionDescription: "Extract to function in module scope",
+ newContent:
+`export function fn(m: number, n: number) {
+ const mode = m >= 0 ? "a" : "b";
+ let result: number = 0;
+
+ if (mode === "a") {
+ result = /*RENAME*/newFunction(n, result);
+ }
+ else {
+ result = 0;
+ }
+
+ return result;
+}
+
+function newFunction(n: number, result: number) {
+ for (let i = 0; i < n; i++) {
+ const rand = Math.random();
+ if (rand > 0.5) {
+ result = rand;
+ break;
+ }
+ }
+ return result;
+}
+`
+});
diff --git a/tests/cases/fourslash/extract-method47.ts b/tests/cases/fourslash/extract-method47.ts
new file mode 100644
index 00000000000..f3097923a6d
--- /dev/null
+++ b/tests/cases/fourslash/extract-method47.ts
@@ -0,0 +1,60 @@
+///
+
+////export function fn(m: number, n: number) {
+//// const mode = m >= 0 ? "a" : "b";
+//// let result: number = 0;
+////
+//// if (mode === "a") {
+//// /*a*/for (let i = 0; i < n; i++) {
+//// const rand = Math.random();
+//// switch (rand) {
+//// case 0.5:
+//// result = rand;
+//// break;
+//// default:
+//// result = 1;
+//// break;
+//// }
+//// }/*b*/
+//// }
+//// else {
+//// result = 0;
+//// }
+//// return result;
+////}
+
+goTo.select("a", "b");
+edit.applyRefactor({
+ refactorName: "Extract Symbol",
+ actionName: "function_scope_1",
+ actionDescription: "Extract to function in module scope",
+ newContent:
+`export function fn(m: number, n: number) {
+ const mode = m >= 0 ? "a" : "b";
+ let result: number = 0;
+
+ if (mode === "a") {
+ result = /*RENAME*/newFunction(n, result);
+ }
+ else {
+ result = 0;
+ }
+ return result;
+}
+
+function newFunction(n: number, result: number) {
+ for (let i = 0; i < n; i++) {
+ const rand = Math.random();
+ switch (rand) {
+ case 0.5:
+ result = rand;
+ break;
+ default:
+ result = 1;
+ break;
+ }
+ }
+ return result;
+}
+`
+});
diff --git a/tests/cases/fourslash/extract-method48.ts b/tests/cases/fourslash/extract-method48.ts
new file mode 100644
index 00000000000..ffbab80c6f9
--- /dev/null
+++ b/tests/cases/fourslash/extract-method48.ts
@@ -0,0 +1,36 @@
+///
+
+////export function fn(x: number, y: number) {
+//// /*a*/switch (x) {
+//// case 1:
+//// if (y) {
+//// break;
+//// }
+//// x--;
+//// break;
+//// }/*b*/
+////}
+
+goTo.select("a", "b");
+edit.applyRefactor({
+ refactorName: "Extract Symbol",
+ actionName: "function_scope_1",
+ actionDescription: "Extract to function in module scope",
+ newContent:
+`export function fn(x: number, y: number) {
+ x = /*RENAME*/newFunction(x, y);
+}
+
+function newFunction(x: number, y: number) {
+ switch (x) {
+ case 1:
+ if (y) {
+ break;
+ }
+ x--;
+ break;
+ }
+ return x;
+}
+`
+});