Skip to content

Commit 6b4f730

Browse files
authored
Fix binding of jsdoc typedefs with no in-comment name attached to an expression statement (microsoft#32610)
* Fix binding of jsdoc typedefs with no in-comment name attached to an expression statement * Check toplevel flag before bind * Small renames
1 parent 62f65a7 commit 6b4f730

40 files changed

+739
-350
lines changed

src/compiler/binder.ts

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -490,11 +490,11 @@ namespace ts {
490490
// and should never be merged directly with other augmentation, and the latter case would be possible if automatic merge is allowed.
491491
if (isJSDocTypeAlias(node)) Debug.assert(isInJSFile(node)); // We shouldn't add symbols for JSDoc nodes if not in a JS file.
492492
if ((!isAmbientModule(node) && (hasExportModifier || container.flags & NodeFlags.ExportContext)) || isJSDocTypeAlias(node)) {
493-
if (hasModifier(node, ModifierFlags.Default) && !getDeclarationName(node)) {
493+
if (!container.locals || (hasModifier(node, ModifierFlags.Default) && !getDeclarationName(node))) {
494494
return declareSymbol(container.symbol.exports!, container.symbol, node, symbolFlags, symbolExcludes); // No local symbol for an unnamed default!
495495
}
496496
const exportKind = symbolFlags & SymbolFlags.Value ? SymbolFlags.ExportValue : 0;
497-
const local = declareSymbol(container.locals!, /*parent*/ undefined, node, exportKind, symbolExcludes);
497+
const local = declareSymbol(container.locals, /*parent*/ undefined, node, exportKind, symbolExcludes);
498498
local.exportSymbol = declareSymbol(container.symbol.exports!, container.symbol, node, symbolFlags, symbolExcludes);
499499
node.localSymbol = local;
500500
return local;
@@ -1806,7 +1806,19 @@ namespace ts {
18061806
currentFlow = { flags: FlowFlags.Start };
18071807
parent = typeAlias;
18081808
bind(typeAlias.typeExpression);
1809-
if (isJSDocEnumTag(typeAlias) || !typeAlias.fullName || typeAlias.fullName.kind === SyntaxKind.Identifier) {
1809+
const declName = getNameOfDeclaration(typeAlias);
1810+
if ((isJSDocEnumTag(typeAlias) || !typeAlias.fullName) && declName && isPropertyAccessEntityNameExpression(declName.parent)) {
1811+
// typedef anchored to an A.B.C assignment - we need to bind into B's namespace under name C
1812+
const isTopLevel = isTopLevelNamespaceAssignment(declName.parent);
1813+
if (isTopLevel) {
1814+
bindPotentiallyMissingNamespaces(file.symbol, declName.parent, isTopLevel, !!findAncestor(declName, d => isPropertyAccessExpression(d) && d.name.escapedText === "prototype"));
1815+
const oldContainer = container;
1816+
container = isPropertyAccessExpression(declName.parent.expression) ? declName.parent.expression.name : declName.parent.expression;
1817+
declareModuleMember(typeAlias, SymbolFlags.TypeAlias, SymbolFlags.TypeAliasExcludes);
1818+
container = oldContainer;
1819+
}
1820+
}
1821+
else if (isJSDocEnumTag(typeAlias) || !typeAlias.fullName || typeAlias.fullName.kind === SyntaxKind.Identifier) {
18101822
parent = typeAlias.parent;
18111823
bindBlockScopedDeclaration(typeAlias, SymbolFlags.TypeAlias, SymbolFlags.TypeAliasExcludes);
18121824
}
@@ -2607,7 +2619,7 @@ namespace ts {
26072619
}
26082620

26092621
function bindPotentiallyMissingNamespaces(namespaceSymbol: Symbol | undefined, entityName: EntityNameExpression, isToplevel: boolean, isPrototypeProperty: boolean) {
2610-
if (isToplevel && !isPrototypeProperty && (!namespaceSymbol || !(namespaceSymbol.flags & SymbolFlags.Namespace))) {
2622+
if (isToplevel && !isPrototypeProperty) {
26112623
// make symbols or add declarations for intermediate containers
26122624
const flags = SymbolFlags.Module | SymbolFlags.Assignment;
26132625
const excludeFlags = SymbolFlags.ValueModuleExcludes & ~SymbolFlags.Assignment;
@@ -2642,11 +2654,15 @@ namespace ts {
26422654
declareSymbol(symbolTable, namespaceSymbol, declaration, includes | SymbolFlags.Assignment, excludes & ~SymbolFlags.Assignment);
26432655
}
26442656

2645-
function bindPropertyAssignment(name: EntityNameExpression, propertyAccess: PropertyAccessEntityNameExpression, isPrototypeProperty: boolean) {
2646-
let namespaceSymbol = lookupSymbolForPropertyAccess(name);
2647-
const isToplevel = isBinaryExpression(propertyAccess.parent)
2657+
function isTopLevelNamespaceAssignment(propertyAccess: PropertyAccessEntityNameExpression) {
2658+
return isBinaryExpression(propertyAccess.parent)
26482659
? getParentOfBinaryExpression(propertyAccess.parent).parent.kind === SyntaxKind.SourceFile
26492660
: propertyAccess.parent.parent.kind === SyntaxKind.SourceFile;
2661+
}
2662+
2663+
function bindPropertyAssignment(name: EntityNameExpression, propertyAccess: PropertyAccessEntityNameExpression, isPrototypeProperty: boolean) {
2664+
let namespaceSymbol = lookupSymbolForPropertyAccess(name);
2665+
const isToplevel = isTopLevelNamespaceAssignment(propertyAccess);
26502666
namespaceSymbol = bindPotentiallyMissingNamespaces(namespaceSymbol, propertyAccess.expression, isToplevel, isPrototypeProperty);
26512667
bindPotentiallyNewExpandoMemberToNamespace(propertyAccess, namespaceSymbol, isPrototypeProperty);
26522668
}

src/compiler/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3661,8 +3661,8 @@ namespace ts {
36613661

36623662
Enum = RegularEnum | ConstEnum,
36633663
Variable = FunctionScopedVariable | BlockScopedVariable,
3664-
Value = Variable | Property | EnumMember | ObjectLiteral | Function | Class | Enum | ValueModule | Method | GetAccessor | SetAccessor | Assignment,
3665-
Type = Class | Interface | Enum | EnumMember | TypeLiteral | TypeParameter | TypeAlias | Assignment,
3664+
Value = Variable | Property | EnumMember | ObjectLiteral | Function | Class | Enum | ValueModule | Method | GetAccessor | SetAccessor,
3665+
Type = Class | Interface | Enum | EnumMember | TypeLiteral | TypeParameter | TypeAlias,
36663666
Namespace = ValueModule | NamespaceModule | Enum,
36673667
Module = ValueModule | NamespaceModule,
36683668
Accessor = GetAccessor | SetAccessor,
@@ -3683,7 +3683,7 @@ namespace ts {
36833683
InterfaceExcludes = Type & ~(Interface | Class),
36843684
RegularEnumExcludes = (Value | Type) & ~(RegularEnum | ValueModule), // regular enums merge only with regular enums and modules
36853685
ConstEnumExcludes = (Value | Type) & ~ConstEnum, // const enums merge only with const enums
3686-
ValueModuleExcludes = Value & ~(Function | Class | RegularEnum | ValueModule | Assignment),
3686+
ValueModuleExcludes = Value & ~(Function | Class | RegularEnum | ValueModule),
36873687
NamespaceModuleExcludes = 0,
36883688
MethodExcludes = Value & ~Method,
36893689
GetAccessorExcludes = Value & ~SetAccessor,

src/compiler/utilities.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5124,7 +5124,10 @@ namespace ts {
51245124
}
51255125
break;
51265126
case SyntaxKind.ExpressionStatement:
5127-
const expr = hostNode.expression;
5127+
let expr = hostNode.expression;
5128+
if (expr.kind === SyntaxKind.BinaryExpression && (expr as BinaryExpression).operatorToken.kind === SyntaxKind.EqualsToken) {
5129+
expr = (expr as BinaryExpression).left;
5130+
}
51285131
switch (expr.kind) {
51295132
case SyntaxKind.PropertyAccessExpression:
51305133
return (expr as PropertyAccessExpression).name;

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2127,28 +2127,28 @@ declare namespace ts {
21272127
ModuleExports = 134217728,
21282128
Enum = 384,
21292129
Variable = 3,
2130-
Value = 67220415,
2131-
Type = 67897832,
2130+
Value = 111551,
2131+
Type = 788968,
21322132
Namespace = 1920,
21332133
Module = 1536,
21342134
Accessor = 98304,
2135-
FunctionScopedVariableExcludes = 67220414,
2136-
BlockScopedVariableExcludes = 67220415,
2137-
ParameterExcludes = 67220415,
2135+
FunctionScopedVariableExcludes = 111550,
2136+
BlockScopedVariableExcludes = 111551,
2137+
ParameterExcludes = 111551,
21382138
PropertyExcludes = 0,
2139-
EnumMemberExcludes = 68008959,
2140-
FunctionExcludes = 67219887,
2141-
ClassExcludes = 68008383,
2142-
InterfaceExcludes = 67897736,
2143-
RegularEnumExcludes = 68008191,
2144-
ConstEnumExcludes = 68008831,
2139+
EnumMemberExcludes = 900095,
2140+
FunctionExcludes = 111023,
2141+
ClassExcludes = 899519,
2142+
InterfaceExcludes = 788872,
2143+
RegularEnumExcludes = 899327,
2144+
ConstEnumExcludes = 899967,
21452145
ValueModuleExcludes = 110735,
21462146
NamespaceModuleExcludes = 0,
2147-
MethodExcludes = 67212223,
2148-
GetAccessorExcludes = 67154879,
2149-
SetAccessorExcludes = 67187647,
2150-
TypeParameterExcludes = 67635688,
2151-
TypeAliasExcludes = 67897832,
2147+
MethodExcludes = 103359,
2148+
GetAccessorExcludes = 46015,
2149+
SetAccessorExcludes = 78783,
2150+
TypeParameterExcludes = 526824,
2151+
TypeAliasExcludes = 788968,
21522152
AliasExcludes = 2097152,
21532153
ModuleMember = 2623475,
21542154
ExportHasLocal = 944,

tests/baselines/reference/api/typescript.d.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2127,28 +2127,28 @@ declare namespace ts {
21272127
ModuleExports = 134217728,
21282128
Enum = 384,
21292129
Variable = 3,
2130-
Value = 67220415,
2131-
Type = 67897832,
2130+
Value = 111551,
2131+
Type = 788968,
21322132
Namespace = 1920,
21332133
Module = 1536,
21342134
Accessor = 98304,
2135-
FunctionScopedVariableExcludes = 67220414,
2136-
BlockScopedVariableExcludes = 67220415,
2137-
ParameterExcludes = 67220415,
2135+
FunctionScopedVariableExcludes = 111550,
2136+
BlockScopedVariableExcludes = 111551,
2137+
ParameterExcludes = 111551,
21382138
PropertyExcludes = 0,
2139-
EnumMemberExcludes = 68008959,
2140-
FunctionExcludes = 67219887,
2141-
ClassExcludes = 68008383,
2142-
InterfaceExcludes = 67897736,
2143-
RegularEnumExcludes = 68008191,
2144-
ConstEnumExcludes = 68008831,
2139+
EnumMemberExcludes = 900095,
2140+
FunctionExcludes = 111023,
2141+
ClassExcludes = 899519,
2142+
InterfaceExcludes = 788872,
2143+
RegularEnumExcludes = 899327,
2144+
ConstEnumExcludes = 899967,
21452145
ValueModuleExcludes = 110735,
21462146
NamespaceModuleExcludes = 0,
2147-
MethodExcludes = 67212223,
2148-
GetAccessorExcludes = 67154879,
2149-
SetAccessorExcludes = 67187647,
2150-
TypeParameterExcludes = 67635688,
2151-
TypeAliasExcludes = 67897832,
2147+
MethodExcludes = 103359,
2148+
GetAccessorExcludes = 46015,
2149+
SetAccessorExcludes = 78783,
2150+
TypeParameterExcludes = 526824,
2151+
TypeAliasExcludes = 788968,
21522152
AliasExcludes = 2097152,
21532153
ModuleMember = 2623475,
21542154
ExportHasLocal = 944,

tests/baselines/reference/checkJsdocTypeTagOnObjectProperty1.symbols

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var lol = "hello Lol"
44
>lol : Symbol(lol, Decl(0.js, 1, 3))
55

66
const obj = {
7-
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1))
7+
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1), Decl(0.js, 19, 7), Decl(0.js, 21, 23))
88

99
/** @type {string|undefined} */
1010
foo: undefined,
@@ -40,31 +40,31 @@ const obj = {
4040
}
4141
obj.foo = 'string'
4242
>obj.foo : Symbol(foo, Decl(0.js, 2, 13))
43-
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1))
43+
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1), Decl(0.js, 19, 7), Decl(0.js, 21, 23))
4444
>foo : Symbol(foo, Decl(0.js, 2, 13))
4545

4646
obj.lol
4747
>obj.lol : Symbol(lol, Decl(0.js, 10, 4))
48-
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1))
48+
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1), Decl(0.js, 19, 7), Decl(0.js, 21, 23))
4949
>lol : Symbol(lol, Decl(0.js, 10, 4))
5050

5151
obj.bar = undefined;
5252
>obj.bar : Symbol(bar, Decl(0.js, 4, 17))
53-
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1))
53+
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1), Decl(0.js, 19, 7), Decl(0.js, 21, 23))
5454
>bar : Symbol(bar, Decl(0.js, 4, 17))
5555
>undefined : Symbol(undefined)
5656

5757
var k = obj.method1(0);
5858
>k : Symbol(k, Decl(0.js, 21, 3))
5959
>obj.method1 : Symbol(method1, Decl(0.js, 6, 12))
60-
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1))
60+
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1), Decl(0.js, 19, 7), Decl(0.js, 21, 23))
6161
>method1 : Symbol(method1, Decl(0.js, 6, 12))
6262

6363
obj.bar1 = "42";
64-
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1))
64+
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1), Decl(0.js, 19, 7), Decl(0.js, 21, 23))
6565

6666
obj.arrowFunc(0);
6767
>obj.arrowFunc : Symbol(arrowFunc, Decl(0.js, 14, 20))
68-
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1))
68+
>obj : Symbol(obj, Decl(0.js, 2, 5), Decl(0.js, 17, 1), Decl(0.js, 19, 7), Decl(0.js, 21, 23))
6969
>arrowFunc : Symbol(arrowFunc, Decl(0.js, 14, 20))
7070

tests/baselines/reference/checkObjectDefineProperty.symbols

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@ x.middleInit = "R"; // should also fail
7070

7171
=== tests/cases/conformance/jsdoc/index.js ===
7272
const x = {};
73-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
73+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
7474

7575
Object.defineProperty(x, "name", { value: "Charles", writable: true });
7676
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
7777
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
7878
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
79-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
79+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
8080
>"name" : Symbol(x.name, Decl(index.js, 0, 13))
8181
>value : Symbol(value, Decl(index.js, 1, 34))
8282
>writable : Symbol(writable, Decl(index.js, 1, 52))
@@ -85,15 +85,15 @@ Object.defineProperty(x, "middleInit", { value: "H" });
8585
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
8686
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
8787
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
88-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
88+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
8989
>"middleInit" : Symbol(x.middleInit, Decl(index.js, 1, 71))
9090
>value : Symbol(value, Decl(index.js, 2, 40))
9191

9292
Object.defineProperty(x, "lastName", { value: "Smith", writable: false });
9393
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
9494
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
9595
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
96-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
96+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
9797
>"lastName" : Symbol(x.lastName, Decl(index.js, 2, 55))
9898
>value : Symbol(value, Decl(index.js, 3, 38))
9999
>writable : Symbol(writable, Decl(index.js, 3, 54))
@@ -102,7 +102,7 @@ Object.defineProperty(x, "zip", { get() { return 98122 }, set(_) { /*ignore*/ }
102102
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
103103
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
104104
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
105-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
105+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
106106
>"zip" : Symbol(x.zip, Decl(index.js, 3, 74))
107107
>get : Symbol(get, Decl(index.js, 4, 33))
108108
>set : Symbol(set, Decl(index.js, 4, 57))
@@ -112,15 +112,15 @@ Object.defineProperty(x, "houseNumber", { get() { return 21.75 } });
112112
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
113113
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
114114
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
115-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
115+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
116116
>"houseNumber" : Symbol(x.houseNumber, Decl(index.js, 4, 83))
117117
>get : Symbol(get, Decl(index.js, 5, 41))
118118

119119
Object.defineProperty(x, "zipStr", {
120120
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
121121
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
122122
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
123-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
123+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
124124
>"zipStr" : Symbol(x.zipStr, Decl(index.js, 5, 68))
125125

126126
/** @param {string} str */
@@ -147,15 +147,15 @@ function takeName(named) { return named.name; }
147147

148148
takeName(x);
149149
>takeName : Symbol(takeName, Decl(index.js, 11, 3))
150-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
150+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
151151

152152
/**
153153
* @type {number}
154154
*/
155155
var a = x.zip;
156156
>a : Symbol(a, Decl(index.js, 22, 3))
157157
>x.zip : Symbol(x.zip, Decl(index.js, 3, 74))
158-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
158+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
159159
>zip : Symbol(x.zip, Decl(index.js, 3, 74))
160160

161161
/**
@@ -164,17 +164,17 @@ var a = x.zip;
164164
var b = x.houseNumber;
165165
>b : Symbol(b, Decl(index.js, 27, 3))
166166
>x.houseNumber : Symbol(x.houseNumber, Decl(index.js, 4, 83))
167-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
167+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
168168
>houseNumber : Symbol(x.houseNumber, Decl(index.js, 4, 83))
169169

170170
const returnExemplar = () => x;
171171
>returnExemplar : Symbol(returnExemplar, Decl(index.js, 29, 5))
172-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
172+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
173173

174174
const needsExemplar = (_ = x) => void 0;
175175
>needsExemplar : Symbol(needsExemplar, Decl(index.js, 30, 5))
176176
>_ : Symbol(_, Decl(index.js, 30, 23))
177-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
177+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
178178

179179
const expected = /** @type {{name: string, readonly middleInit: string, readonly lastName: string, zip: number, readonly houseNumber: number, zipStr: string}} */(/** @type {*} */(null));
180180
>expected : Symbol(expected, Decl(index.js, 32, 5))
@@ -199,5 +199,5 @@ module.exports = x;
199199
>module.exports : Symbol("tests/cases/conformance/jsdoc/index", Decl(index.js, 0, 0))
200200
>module : Symbol(export=, Decl(index.js, 41, 48))
201201
>exports : Symbol(export=, Decl(index.js, 41, 48))
202-
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22))
202+
>x : Symbol(x, Decl(index.js, 0, 5), Decl(index.js, 1, 22), Decl(index.js, 2, 22), Decl(index.js, 3, 22), Decl(index.js, 4, 22) ... and 2 more)
203203

0 commit comments

Comments
 (0)