diff --git a/src/services/refactors/moveToNewFile.ts b/src/services/refactors/moveToNewFile.ts index ad707f8d2e7..fda2aa29124 100644 --- a/src/services/refactors/moveToNewFile.ts +++ b/src/services/refactors/moveToNewFile.ts @@ -453,7 +453,7 @@ namespace ts.refactor { const top = getTopLevelDeclarationStatement(decl); if (markSeenTop(top)) { - addExportToChanges(oldFile, top, changes, useEs6ModuleSyntax); + addExportToChanges(oldFile, top, name, changes, useEs6ModuleSyntax); } if (hasSyntacticModifier(decl, ModifierFlags.Default)) { oldFileDefault = name; @@ -759,8 +759,8 @@ namespace ts.refactor { } } - function addExportToChanges(sourceFile: SourceFile, decl: TopLevelDeclarationStatement, changes: textChanges.ChangeTracker, useEs6Exports: boolean): void { - if (isExported(sourceFile, decl, useEs6Exports)) return; + function addExportToChanges(sourceFile: SourceFile, decl: TopLevelDeclarationStatement, name: Identifier, changes: textChanges.ChangeTracker, useEs6Exports: boolean): void { + if (isExported(sourceFile, decl, useEs6Exports, name)) return; if (useEs6Exports) { if (!isExpressionStatement(decl)) changes.insertExportModifier(sourceFile, decl); } @@ -770,13 +770,11 @@ namespace ts.refactor { } } - function isExported(sourceFile: SourceFile, decl: TopLevelDeclarationStatement, useEs6Exports: boolean): boolean { + function isExported(sourceFile: SourceFile, decl: TopLevelDeclarationStatement, useEs6Exports: boolean, name?: Identifier): boolean { if (useEs6Exports) { - return !isExpressionStatement(decl) && hasSyntacticModifier(decl, ModifierFlags.Export); - } - else { - return getNamesToExportInCommonJS(decl).some(name => sourceFile.symbol.exports!.has(escapeLeadingUnderscores(name))); + return !isExpressionStatement(decl) && hasSyntacticModifier(decl, ModifierFlags.Export) || !!(name && sourceFile.symbol.exports?.has(name.escapedText)); } + return getNamesToExportInCommonJS(decl).some(name => sourceFile.symbol.exports!.has(escapeLeadingUnderscores(name))); } function addExport(decl: TopLevelDeclarationStatement, useEs6Exports: boolean): readonly Statement[] | undefined { diff --git a/tests/cases/fourslash/moveToNewFile_namedExport1.ts b/tests/cases/fourslash/moveToNewFile_namedExport1.ts new file mode 100644 index 00000000000..f0b557ba6c7 --- /dev/null +++ b/tests/cases/fourslash/moveToNewFile_namedExport1.ts @@ -0,0 +1,20 @@ +/// + +// @Filename: /a.ts +////const a = 1; +////[|const b = a + 1;|] +////export { a }; + +verify.moveToNewFile({ + newFileContents: { + "/a.ts": +`const a = 1; +export { a };`, + + "/b.ts": +`import { a } from "./a"; + +const b = a + 1; +`, + } +}); diff --git a/tests/cases/fourslash/moveToNewFile_namedExport2.ts b/tests/cases/fourslash/moveToNewFile_namedExport2.ts new file mode 100644 index 00000000000..34c887f6354 --- /dev/null +++ b/tests/cases/fourslash/moveToNewFile_namedExport2.ts @@ -0,0 +1,21 @@ +/// + +// @Filename: /a.ts +////const a = 1, b = 2; +////[|const c = b + 1;|] +////export { a, b }; + +verify.moveToNewFile({ + newFileContents: { + "/a.ts": +`const a = 1, b = 2; +export { a, b };`, + + "/c.ts": +`import { b } from "./a"; + +const c = b + 1; +`, + } +}); + diff --git a/tests/cases/fourslash/moveToNewFile_namedExport3.ts b/tests/cases/fourslash/moveToNewFile_namedExport3.ts new file mode 100644 index 00000000000..b791b45b321 --- /dev/null +++ b/tests/cases/fourslash/moveToNewFile_namedExport3.ts @@ -0,0 +1,23 @@ +/// + +// @Filename: /a.ts +////const a = 1; +////[|const b = a + 1;|] +////export const c = a + b; + +verify.moveToNewFile({ + newFileContents: { + "/a.ts": +`import { b } from "./b"; + +export const a = 1; +export const c = a + b;`, + + "/b.ts": +`import { a } from "./a"; + +export const b = a + 1; +`, + } +}); +