Fix error on duplicate commonjs exports (#40545)

* Fix error on duplicate commonjs exports

Previously, the code missed setting the parent pointer for the lhs
access expression.

Also add declaration emit of element access expressions, missed in my
previous PR.

* Switch to excludes=None, add test case

CommonJS exports have None excludes, but still have an error issued by
the checker. This is the previous behaviour even though it would be nice
to add some exclusions.
This commit is contained in:
Nathan Shively-Sanders
2020-09-14 13:12:51 -07:00
committed by GitHub
parent c493d077a3
commit ec36d73e7a
11 changed files with 109 additions and 3 deletions
+2 -2
View File
@@ -2810,8 +2810,8 @@ namespace ts {
if (symbol) {
const isAlias = isAliasableExpression(node.right) && (isExportsIdentifier(node.left.expression) || isModuleExportsAccessExpression(node.left.expression));
const flags = isAlias ? SymbolFlags.Alias : SymbolFlags.Property | SymbolFlags.ExportValue;
const excludeFlags = isAlias ? SymbolFlags.AliasExcludes : SymbolFlags.None;
declareSymbol(symbol.exports!, symbol, node.left, flags, excludeFlags);
setParent(node.left, node);
declareSymbol(symbol.exports!, symbol, node.left, flags, SymbolFlags.None);
}
}
+1
View File
@@ -6831,6 +6831,7 @@ namespace ts {
break;
case SyntaxKind.BinaryExpression:
case SyntaxKind.PropertyAccessExpression:
case SyntaxKind.ElementAccessExpression:
// Could be best encoded as though an export specifier or as though an export assignment
// If name is default or export=, do an export assignment
// Otherwise do an export specifier
@@ -0,0 +1,17 @@
//// [moduleExportAliasElementAccessExpression.js]
function D () { }
exports["D"] = D;
// (the only package I could find that uses spaces in identifiers is webidl-conversions)
exports["Does not work yet"] = D;
//// [moduleExportAliasElementAccessExpression.js]
function D() { }
exports["D"] = D;
// (the only package I could find that uses spaces in identifiers is webidl-conversions)
exports["Does not work yet"] = D;
//// [moduleExportAliasElementAccessExpression.d.ts]
export function D(): void;
export { D as _Does_not_work_yet };
@@ -7,3 +7,9 @@ exports["D"] = D;
>"D" : Symbol("D", Decl(moduleExportAliasElementAccessExpression.js, 0, 17))
>D : Symbol(D, Decl(moduleExportAliasElementAccessExpression.js, 0, 0))
// (the only package I could find that uses spaces in identifiers is webidl-conversions)
exports["Does not work yet"] = D;
>exports : Symbol("tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression", Decl(moduleExportAliasElementAccessExpression.js, 0, 0))
>"Does not work yet" : Symbol("Does not work yet", Decl(moduleExportAliasElementAccessExpression.js, 1, 17))
>D : Symbol(D, Decl(moduleExportAliasElementAccessExpression.js, 0, 0))
@@ -9,3 +9,11 @@ exports["D"] = D;
>"D" : "D"
>D : () => void
// (the only package I could find that uses spaces in identifiers is webidl-conversions)
exports["Does not work yet"] = D;
>exports["Does not work yet"] = D : () => void
>exports["Does not work yet"] : () => void
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasElementAccessExpression")
>"Does not work yet" : "Does not work yet"
>D : () => void
@@ -0,0 +1,16 @@
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(1,1): error TS2323: Cannot redeclare exported variable 'apply'.
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(3,1): error TS2322: Type '() => void' is not assignable to type 'undefined'.
tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js(3,1): error TS2323: Cannot redeclare exported variable 'apply'.
==== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js (3 errors) ====
exports.apply = undefined;
~~~~~~~~~~~~~
!!! error TS2323: Cannot redeclare exported variable 'apply'.
function a() { }
exports.apply = a;
~~~~~~~~~~~~~
!!! error TS2322: Type '() => void' is not assignable to type 'undefined'.
~~~~~~~~~~~~~
!!! error TS2323: Cannot redeclare exported variable 'apply'.
@@ -0,0 +1,14 @@
//// [moduleExportAliasDuplicateAlias.js]
exports.apply = undefined;
function a() { }
exports.apply = a;
//// [moduleExportAliasDuplicateAlias.js]
exports.apply = undefined;
function a() { }
exports.apply = a;
//// [moduleExportAliasDuplicateAlias.d.ts]
export { undefined as apply };
@@ -0,0 +1,16 @@
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
exports.apply = undefined;
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>undefined : Symbol(apply)
function a() { }
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 26))
exports.apply = a;
>exports.apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>exports : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>apply : Symbol(apply, Decl(moduleExportAliasDuplicateAlias.js, 0, 0), Decl(moduleExportAliasDuplicateAlias.js, 1, 16))
>a : Symbol(a, Decl(moduleExportAliasDuplicateAlias.js, 0, 26))
@@ -0,0 +1,18 @@
=== tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias.js ===
exports.apply = undefined;
>exports.apply = undefined : undefined
>exports.apply : undefined
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : undefined
>undefined : undefined
function a() { }
>a : () => void
exports.apply = a;
>exports.apply = a : () => void
>exports.apply : undefined
>exports : typeof import("tests/cases/conformance/salsa/moduleExportAliasDuplicateAlias")
>apply : undefined
>a : () => void
@@ -1,6 +1,9 @@
// @noEmit: true
// @declaration: true
// @checkJs: true
// @filename: moduleExportAliasElementAccessExpression.js
// @outdir: out
function D () { }
exports["D"] = D;
// (the only package I could find that uses spaces in identifiers is webidl-conversions)
exports["Does not work yet"] = D;
@@ -0,0 +1,7 @@
// @checkJs: true
// @declaration: true
// @filename: moduleExportAliasDuplicateAlias.js
// @outdir: out
exports.apply = undefined;
function a() { }
exports.apply = a;