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:
parent
c493d077a3
commit
ec36d73e7a
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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'.
|
||||
|
14
tests/baselines/reference/moduleExportDuplicateAlias.js
Normal file
14
tests/baselines/reference/moduleExportDuplicateAlias.js
Normal 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 };
|
16
tests/baselines/reference/moduleExportDuplicateAlias.symbols
Normal file
16
tests/baselines/reference/moduleExportDuplicateAlias.symbols
Normal 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))
|
||||
|
18
tests/baselines/reference/moduleExportDuplicateAlias.types
Normal file
18
tests/baselines/reference/moduleExportDuplicateAlias.types
Normal 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
|
||||
|
|
@ -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;
|
Loading…
Reference in a new issue