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; +} +` +});