From 9c99870058f8e2b86ef55dce809e4915794d5325 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Fri, 11 Sep 2020 18:05:47 -0700 Subject: [PATCH] Support element access aliases: exports["x"] = x (#40514) --- src/compiler/checker.ts | 7 ++++--- .../moduleExportAliasElementAccessExpression.symbols | 9 +++++++++ .../moduleExportAliasElementAccessExpression.types | 11 +++++++++++ .../salsa/moduleExportAliasElementAccessExpression.ts | 6 ++++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/moduleExportAliasElementAccessExpression.symbols create mode 100644 tests/baselines/reference/moduleExportAliasElementAccessExpression.types create mode 100644 tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e21e46126f4..cccf77a3d56 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2408,7 +2408,7 @@ namespace ts { || node.kind === SyntaxKind.ExportSpecifier || node.kind === SyntaxKind.ExportAssignment && exportAssignmentIsAlias(node) || isBinaryExpression(node) && getAssignmentDeclarationKind(node) === AssignmentDeclarationKind.ModuleExports && exportAssignmentIsAlias(node) - || isPropertyAccessExpression(node) + || isAccessExpression(node) && isBinaryExpression(node.parent) && node.parent.left === node && node.parent.operatorToken.kind === SyntaxKind.EqualsToken @@ -2803,7 +2803,7 @@ namespace ts { return getTargetOfAliasLikeExpression(expression, dontRecursivelyResolve); } - function getTargetOfPropertyAccessExpression(node: PropertyAccessExpression, dontRecursivelyResolve: boolean): Symbol | undefined { + function getTargetOfAccessExpression(node: AccessExpression, dontRecursivelyResolve: boolean): Symbol | undefined { if (!(isBinaryExpression(node.parent) && node.parent.left === node && node.parent.operatorToken.kind === SyntaxKind.EqualsToken)) { return undefined; } @@ -2836,8 +2836,9 @@ namespace ts { return resolveEntityName((node as ShorthandPropertyAssignment).name, SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace, /*ignoreErrors*/ true, dontRecursivelyResolve); case SyntaxKind.PropertyAssignment: return getTargetOfPropertyAssignment(node as PropertyAssignment, dontRecursivelyResolve); + case SyntaxKind.ElementAccessExpression: case SyntaxKind.PropertyAccessExpression: - return getTargetOfPropertyAccessExpression(node as PropertyAccessExpression, dontRecursivelyResolve); + return getTargetOfAccessExpression(node as AccessExpression, dontRecursivelyResolve); default: return Debug.fail(); } diff --git a/tests/baselines/reference/moduleExportAliasElementAccessExpression.symbols b/tests/baselines/reference/moduleExportAliasElementAccessExpression.symbols new file mode 100644 index 00000000000..501941eb682 --- /dev/null +++ b/tests/baselines/reference/moduleExportAliasElementAccessExpression.symbols @@ -0,0 +1,9 @@ +=== tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression.js === +function D () { } +>D : Symbol(D, Decl(moduleExportAliasElementAccessExpression.js, 0, 0)) + +exports["D"] = D; +>exports : Symbol("tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression", Decl(moduleExportAliasElementAccessExpression.js, 0, 0)) +>"D" : Symbol("D", Decl(moduleExportAliasElementAccessExpression.js, 0, 17)) +>D : Symbol(D, Decl(moduleExportAliasElementAccessExpression.js, 0, 0)) + diff --git a/tests/baselines/reference/moduleExportAliasElementAccessExpression.types b/tests/baselines/reference/moduleExportAliasElementAccessExpression.types new file mode 100644 index 00000000000..9b07a6672ce --- /dev/null +++ b/tests/baselines/reference/moduleExportAliasElementAccessExpression.types @@ -0,0 +1,11 @@ +=== tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression.js === +function D () { } +>D : () => void + +exports["D"] = D; +>exports["D"] = D : () => void +>exports["D"] : () => void +>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression") +>"D" : "D" +>D : () => void + diff --git a/tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression.ts b/tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression.ts new file mode 100644 index 00000000000..f6826c68611 --- /dev/null +++ b/tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression.ts @@ -0,0 +1,6 @@ +// @noEmit: true +// @checkJs: true +// @filename: moduleExportAliasElementAccessExpression.js + +function D () { } +exports["D"] = D;