Skip to content

Commit b542bdf

Browse files
authored
Bind typedef/enum on all assignment decl kinds (microsoft#33240)
This fixes a crash on exports, but the code now handles all kinds returned from getAssignmentDeclarationPropertyAccessKind.
1 parent f8f8876 commit b542bdf

File tree

7 files changed

+84
-1
lines changed

7 files changed

+84
-1
lines changed

src/compiler/binder.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1827,7 +1827,23 @@ namespace ts {
18271827
bindPotentiallyMissingNamespaces(file.symbol, declName.parent, isTopLevel,
18281828
!!findAncestor(declName, d => isPropertyAccessExpression(d) && d.name.escapedText === "prototype"), /*containerIsClass*/ false);
18291829
const oldContainer = container;
1830-
container = isPropertyAccessExpression(declName.parent.expression) ? declName.parent.expression.name : declName.parent.expression;
1830+
switch (getAssignmentDeclarationPropertyAccessKind(declName.parent)) {
1831+
case AssignmentDeclarationKind.ExportsProperty:
1832+
case AssignmentDeclarationKind.ModuleExports:
1833+
container = file;
1834+
break;
1835+
case AssignmentDeclarationKind.ThisProperty:
1836+
container = declName.parent.expression;
1837+
break;
1838+
case AssignmentDeclarationKind.PrototypeProperty:
1839+
container = (declName.parent.expression as PropertyAccessExpression).name;
1840+
break;
1841+
case AssignmentDeclarationKind.Property:
1842+
container = isPropertyAccessExpression(declName.parent.expression) ? declName.parent.expression.name : declName.parent.expression;
1843+
break;
1844+
case AssignmentDeclarationKind.None:
1845+
return Debug.fail("Shouldn't have detected typedef or enum on non-assignment declaration");
1846+
}
18311847
declareModuleMember(typeAlias, SymbolFlags.TypeAlias, SymbolFlags.TypeAliasExcludes);
18321848
container = oldContainer;
18331849
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
=== tests/cases/conformance/jsdoc/enumTagOnExports.js ===
2+
/** @enum {number} */
3+
exports.a = {};
4+
>exports.a : Symbol(a, Decl(enumTagOnExports.js, 0, 0), Decl(enumTagOnExports.js, 1, 8), Decl(enumTagOnExports.js, 0, 4))
5+
>exports : Symbol(a, Decl(enumTagOnExports.js, 0, 0), Decl(enumTagOnExports.js, 1, 8), Decl(enumTagOnExports.js, 0, 4))
6+
>a : Symbol(a, Decl(enumTagOnExports.js, 0, 0), Decl(enumTagOnExports.js, 1, 8), Decl(enumTagOnExports.js, 0, 4))
7+
8+
/** @enum {string} */
9+
module.exports.b = {};
10+
>module.exports.b : Symbol(b, Decl(enumTagOnExports.js, 1, 15), Decl(enumTagOnExports.js, 4, 15), Decl(enumTagOnExports.js, 3, 4))
11+
>module.exports : Symbol(b, Decl(enumTagOnExports.js, 1, 15), Decl(enumTagOnExports.js, 4, 15), Decl(enumTagOnExports.js, 3, 4))
12+
>module : Symbol(module, Decl(enumTagOnExports.js, 1, 15))
13+
>exports : Symbol("tests/cases/conformance/jsdoc/enumTagOnExports", Decl(enumTagOnExports.js, 0, 0))
14+
>b : Symbol(b, Decl(enumTagOnExports.js, 1, 15), Decl(enumTagOnExports.js, 4, 15), Decl(enumTagOnExports.js, 3, 4))
15+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
=== tests/cases/conformance/jsdoc/enumTagOnExports.js ===
2+
/** @enum {number} */
3+
exports.a = {};
4+
>exports.a = {} : {}
5+
>exports.a : typeof a
6+
>exports : typeof import("tests/cases/conformance/jsdoc/enumTagOnExports")
7+
>a : typeof a
8+
>{} : {}
9+
10+
/** @enum {string} */
11+
module.exports.b = {};
12+
>module.exports.b = {} : {}
13+
>module.exports.b : typeof b
14+
>module.exports : typeof import("tests/cases/conformance/jsdoc/enumTagOnExports")
15+
>module : { "tests/cases/conformance/jsdoc/enumTagOnExports": typeof import("tests/cases/conformance/jsdoc/enumTagOnExports"); }
16+
>exports : typeof import("tests/cases/conformance/jsdoc/enumTagOnExports")
17+
>b : typeof b
18+
>{} : {}
19+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
=== tests/cases/conformance/jsdoc/enumTagOnExports.js ===
2+
/** @enum {string} */
3+
module.exports = {};
4+
>module.exports : Symbol("tests/cases/conformance/jsdoc/enumTagOnExports", Decl(enumTagOnExports.js, 0, 0))
5+
>module : Symbol(module, Decl(enumTagOnExports.js, 0, 0))
6+
>exports : Symbol("tests/cases/conformance/jsdoc/enumTagOnExports", Decl(enumTagOnExports.js, 0, 0))
7+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/conformance/jsdoc/enumTagOnExports.js ===
2+
/** @enum {string} */
3+
module.exports = {};
4+
>module.exports = {} : typeof import("tests/cases/conformance/jsdoc/enumTagOnExports")
5+
>module.exports : typeof import("tests/cases/conformance/jsdoc/enumTagOnExports")
6+
>module : { "tests/cases/conformance/jsdoc/enumTagOnExports": typeof import("tests/cases/conformance/jsdoc/enumTagOnExports"); }
7+
>exports : typeof import("tests/cases/conformance/jsdoc/enumTagOnExports")
8+
>{} : {}
9+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// @filename: enumTagOnExports.js
2+
// @allowjs: true
3+
// @checkjs: true
4+
// @noemit: true
5+
6+
/** @enum {number} */
7+
exports.a = {};
8+
9+
/** @enum {string} */
10+
module.exports.b = {};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// @filename: enumTagOnExports.js
2+
// @allowjs: true
3+
// @checkjs: true
4+
// @noemit: true
5+
6+
/** @enum {string} */
7+
module.exports = {};

0 commit comments

Comments
 (0)