Skip to content

Commit 3e3df87

Browse files
authored
Fix crash on aliased,exported @enum tag in jsdoc (#36996)
THe code to bind `@enum` and `@typedef` didn't handle the case that the `@enum` was on a property assignment to an alias of module.exports. Specifically, `x` needs to be correctly aliased to the file's symbol in the example below: ``` var x = module.exports = {}; /** @enum {string} */ x.E = { A: "A" }; ```
1 parent 65e7acc commit 3e3df87

File tree

4 files changed

+53
-1
lines changed

4 files changed

+53
-1
lines changed

src/compiler/binder.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2113,7 +2113,9 @@ namespace ts {
21132113
container = (declName.parent.expression as PropertyAccessExpression).name;
21142114
break;
21152115
case AssignmentDeclarationKind.Property:
2116-
container = isPropertyAccessExpression(declName.parent.expression) ? declName.parent.expression.name : declName.parent.expression;
2116+
container = isExportsOrModuleExportsOrAlias(file, declName.parent.expression) ? file
2117+
: isPropertyAccessExpression(declName.parent.expression) ? declName.parent.expression.name
2118+
: declName.parent.expression;
21172119
break;
21182120
case AssignmentDeclarationKind.None:
21192121
return Debug.fail("Shouldn't have detected typedef or enum on non-assignment declaration");
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
=== tests/cases/conformance/jsdoc/exportedAliasedEnumTag.js ===
2+
var middlewarify = module.exports = {};
3+
>middlewarify : Symbol(middlewarify, Decl(exportedAliasedEnumTag.js, 0, 3))
4+
>module.exports : Symbol("tests/cases/conformance/jsdoc/exportedAliasedEnumTag", Decl(exportedAliasedEnumTag.js, 0, 0))
5+
>module : Symbol(module, Decl(exportedAliasedEnumTag.js, 0, 18))
6+
>exports : Symbol("tests/cases/conformance/jsdoc/exportedAliasedEnumTag", Decl(exportedAliasedEnumTag.js, 0, 0))
7+
8+
/** @enum */
9+
middlewarify.Type = {
10+
>middlewarify.Type : Symbol(Type, Decl(exportedAliasedEnumTag.js, 0, 39), Decl(exportedAliasedEnumTag.js, 3, 13), Decl(exportedAliasedEnumTag.js, 2, 4))
11+
>middlewarify : Symbol(middlewarify, Decl(exportedAliasedEnumTag.js, 0, 3))
12+
>Type : Symbol(Type, Decl(exportedAliasedEnumTag.js, 0, 39), Decl(exportedAliasedEnumTag.js, 3, 13), Decl(exportedAliasedEnumTag.js, 2, 4))
13+
14+
BEFORE: 'before'
15+
>BEFORE : Symbol(BEFORE, Decl(exportedAliasedEnumTag.js, 3, 21))
16+
17+
};
18+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== tests/cases/conformance/jsdoc/exportedAliasedEnumTag.js ===
2+
var middlewarify = module.exports = {};
3+
>middlewarify : typeof import("tests/cases/conformance/jsdoc/exportedAliasedEnumTag")
4+
>module.exports = {} : typeof import("tests/cases/conformance/jsdoc/exportedAliasedEnumTag")
5+
>module.exports : typeof import("tests/cases/conformance/jsdoc/exportedAliasedEnumTag")
6+
>module : { "\"tests/cases/conformance/jsdoc/exportedAliasedEnumTag\"": typeof import("tests/cases/conformance/jsdoc/exportedAliasedEnumTag"); }
7+
>exports : typeof import("tests/cases/conformance/jsdoc/exportedAliasedEnumTag")
8+
>{} : {}
9+
10+
/** @enum */
11+
middlewarify.Type = {
12+
>middlewarify.Type = { BEFORE: 'before'} : { BEFORE: string; }
13+
>middlewarify.Type : { BEFORE: string; }
14+
>middlewarify : typeof import("tests/cases/conformance/jsdoc/exportedAliasedEnumTag")
15+
>Type : { BEFORE: string; }
16+
>{ BEFORE: 'before'} : { BEFORE: string; }
17+
18+
BEFORE: 'before'
19+
>BEFORE : string
20+
>'before' : "before"
21+
22+
};
23+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @noemit: true
2+
// @allowjs: true
3+
// @filename: exportedAliasedEnumTag.js
4+
var middlewarify = module.exports = {};
5+
6+
/** @enum */
7+
middlewarify.Type = {
8+
BEFORE: 'before'
9+
};

0 commit comments

Comments
 (0)