From 5622bc2dd67b68b9e737ad1f8deaff7140a569b3 Mon Sep 17 00:00:00 2001 From: Andy Date: Tue, 22 May 2018 14:00:29 -0700 Subject: [PATCH] moveToNewFile: Support selecting the name of a declaration (#24331) --- src/services/refactors/moveToNewFile.ts | 8 +++++++- .../moveToNewFile_selectionOnName.ts | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/moveToNewFile_selectionOnName.ts diff --git a/src/services/refactors/moveToNewFile.ts b/src/services/refactors/moveToNewFile.ts index 11220205a48..f7ef622b6d4 100644 --- a/src/services/refactors/moveToNewFile.ts +++ b/src/services/refactors/moveToNewFile.ts @@ -22,8 +22,14 @@ namespace ts.refactor { const startNodeIndex = findIndex(statements, s => s.end > range.pos); if (startNodeIndex === -1) return undefined; + + const startStatement = statements[startNodeIndex]; + if (isNamedDeclaration(startStatement) && startStatement.name && rangeContainsRange(startStatement.name, range)) { + return { first: startNodeIndex, afterLast: startNodeIndex + 1 }; + } + // Can't only partially include the start node or be partially into the next node - if (range.pos > statements[startNodeIndex].getStart(file)) return undefined; + if (range.pos > startStatement.getStart(file)) return undefined; const afterEndNodeIndex = findIndex(statements, s => s.end > range.end, startNodeIndex); // Can't be partially into the next node if (afterEndNodeIndex !== -1 && (afterEndNodeIndex === 0 || statements[afterEndNodeIndex].getStart(file) < range.end)) return undefined; diff --git a/tests/cases/fourslash/moveToNewFile_selectionOnName.ts b/tests/cases/fourslash/moveToNewFile_selectionOnName.ts new file mode 100644 index 00000000000..0db64279291 --- /dev/null +++ b/tests/cases/fourslash/moveToNewFile_selectionOnName.ts @@ -0,0 +1,19 @@ +/// + +// @Filename: /a.ts +////export {}; +////function e[|f|]f() { gee(); } +////function gee() { eff(); } + +verify.moveToNewFile({ + newFileContents: { + "/a.ts": +`import { eff } from "./eff"; + +export {}; +export function gee() { eff(); }`, + "/eff.ts": +`import { gee } from "./a"; +export function eff() { gee(); }`, + }, +});