From 2b69b2281afa51dc8dc01be31c9934279708c4bd Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Mon, 24 Feb 2020 13:17:02 -0800 Subject: [PATCH] Properly handle both special export forms when renaming (#36914) * Properly handle both special export forms when renaming Fixes #36713 * Lint --- src/compiler/utilities.ts | 8 ++++++++ src/services/importTracker.ts | 2 +- tests/baselines/reference/renameExportCrash.baseline | 5 +++++ tests/cases/fourslash/renameExportCrash.ts | 9 +++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/renameExportCrash.baseline create mode 100644 tests/cases/fourslash/renameExportCrash.ts diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 9b5b4ff3818..b4977d9abb7 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -5009,6 +5009,14 @@ namespace ts { return node.kind === SyntaxKind.PropertyAccessExpression || node.kind === SyntaxKind.ElementAccessExpression; } + export function getNameOfAccessExpression(node: AccessExpression) { + if (node.kind === SyntaxKind.PropertyAccessExpression) { + return node.name; + } + Debug.assert(node.kind === SyntaxKind.ElementAccessExpression); + return node.argumentExpression; + } + export function isBundleFileTextLike(section: BundleFileSection): section is BundleFileTextLike { switch (section.kind) { case BundleFileSectionKind.Text: diff --git a/src/services/importTracker.ts b/src/services/importTracker.ts index 7e8955f8c9c..41d908efb23 100644 --- a/src/services/importTracker.ts +++ b/src/services/importTracker.ts @@ -517,7 +517,7 @@ namespace ts.FindAllReferences { return undefined; } - const sym = useLhsSymbol ? checker.getSymbolAtLocation(cast(node.left, isPropertyAccessExpression).name) : symbol; + const sym = useLhsSymbol ? checker.getSymbolAtLocation(getNameOfAccessExpression(cast(node.left, isAccessExpression))) : symbol; // Better detection for GH#20803 if (sym && !(checker.getMergedSymbol(sym.parent!).flags & SymbolFlags.Module)) { Debug.fail(`Special property assignment kind does not have a module as its parent. Assignment is ${Debug.formatSymbol(sym)}, parent is ${Debug.formatSymbol(sym.parent!)}`); diff --git a/tests/baselines/reference/renameExportCrash.baseline b/tests/baselines/reference/renameExportCrash.baseline new file mode 100644 index 00000000000..6760dfe1a8f --- /dev/null +++ b/tests/baselines/reference/renameExportCrash.baseline @@ -0,0 +1,5 @@ +/*====== /tests/cases/fourslash/Foo.js ======*/ + +let RENAME; +module.exports = [|RENAME|]; +exports["foo"] = RENAME; diff --git a/tests/cases/fourslash/renameExportCrash.ts b/tests/cases/fourslash/renameExportCrash.ts new file mode 100644 index 00000000000..f0b430c3c20 --- /dev/null +++ b/tests/cases/fourslash/renameExportCrash.ts @@ -0,0 +1,9 @@ +/// + +// @allowNonTsExtensions: true +// @Filename: Foo.js +//// let a; +//// module.exports = /**/a; +//// exports["foo"] = a; + +verify.baselineRename("", { });