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
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 109 additions and 3 deletions

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);
}
}

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

View file

@ -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 };

View file

@ -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))

View file

@ -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

View file

@ -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'.

View file

@ -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 };

View file

@ -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))

View file

@ -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

View file

@ -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;

View file

@ -0,0 +1,7 @@
// @checkJs: true
// @declaration: true
// @filename: moduleExportAliasDuplicateAlias.js
// @outdir: out
exports.apply = undefined;
function a() { }
exports.apply = a;