Skip to content

Commit f4dff24

Browse files
committed
Avoid convertExport when there's a non-identifier or a bogus one
Fixes #44105
1 parent 9eab334 commit f4dff24

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

src/services/refactors/convertExport.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ namespace ts.refactor {
2323
if (!info) return emptyArray;
2424

2525
if (!isRefactorErrorInfo(info)) {
26+
if (!(isIdentifier(info.exportName) && context.program.getTypeChecker().getSymbolAtLocation(info.exportName))) {
27+
return emptyArray;
28+
}
2629
const action = info.wasDefault ? defaultToNamedAction : namedToDefaultAction;
2730
return [{ name: refactorName, description: action.description, actions: [action] }];
2831
}
@@ -107,8 +110,9 @@ namespace ts.refactor {
107110
}
108111

109112
function doChange(exportingSourceFile: SourceFile, program: Program, info: ExportInfo, changes: textChanges.ChangeTracker, cancellationToken: CancellationToken | undefined): void {
110-
changeExport(exportingSourceFile, info, changes, program.getTypeChecker());
111-
changeImports(program, info, changes, cancellationToken);
113+
const checker = program.getTypeChecker();
114+
changeExport(exportingSourceFile, info, changes, checker);
115+
changeImports(program, info, changes, checker, cancellationToken);
112116
}
113117

114118
function changeExport(exportingSourceFile: SourceFile, { wasDefault, exportNode, exportName }: ExportInfo, changes: textChanges.ChangeTracker, checker: TypeChecker): void {
@@ -152,8 +156,7 @@ namespace ts.refactor {
152156
}
153157
}
154158

155-
function changeImports(program: Program, { wasDefault, exportName, exportingModuleSymbol }: ExportInfo, changes: textChanges.ChangeTracker, cancellationToken: CancellationToken | undefined): void {
156-
const checker = program.getTypeChecker();
159+
function changeImports(program: Program, { wasDefault, exportName, exportingModuleSymbol }: ExportInfo, changes: textChanges.ChangeTracker, checker: TypeChecker, cancellationToken: CancellationToken | undefined): void {
157160
const exportSymbol = Debug.checkDefined(checker.getSymbolAtLocation(exportName), "Export name should resolve to a symbol");
158161
FindAllReferences.Core.eachExportReference(program.getSourceFiles(), checker, cancellationToken, exportSymbol, exportingModuleSymbol, exportName.text, wasDefault, ref => {
159162
const importingSourceFile = ref.getSourceFile();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @allowJs: true
4+
5+
// @Filename: /a.js
6+
/////*[| |]*/ /** x */ export default 1;
7+
8+
// @Filename: /b.js
9+
/////*[| |]*/ /** x */ export default (1);
10+
11+
// @Filename: /c.js
12+
/////*[| |]*/ /** x */ export default x;
13+
14+
goTo.eachRange(r => {
15+
goTo.selectRange(r);
16+
verify.not.refactorAvailable("Convert export");
17+
});
18+
19+
// goTo.selectRange(test.ranges()[0]);
20+
// edit.applyRefactor({
21+
// refactorName: "Convert export",
22+
// actionName: "Convert default export to named export",
23+
// actionDescription: "Convert default export to named export",
24+
// newContent: { "/a.js": `...` },
25+
// });

0 commit comments

Comments
 (0)