Skip to content

Commit 69ab1d5

Browse files
authored
Handle Identifier declarations in getDeclarationSpaces (#36136)
1 parent 76ee021 commit 69ab1d5

File tree

4 files changed

+113
-0
lines changed

4 files changed

+113
-0
lines changed

src/compiler/checker.ts

+7
Original file line numberDiff line numberDiff line change
@@ -29265,6 +29265,13 @@ namespace ts {
2926529265
case SyntaxKind.BindingElement:
2926629266
case SyntaxKind.FunctionDeclaration:
2926729267
case SyntaxKind.ImportSpecifier: // https://github.com/Microsoft/TypeScript/pull/7591
29268+
case SyntaxKind.Identifier: // https://github.com/microsoft/TypeScript/issues/36098
29269+
// Identifiers are used as declarations of assignment declarations whose parents may be
29270+
// SyntaxKind.CallExpression - `Object.defineProperty(thing, "aField", {value: 42});`
29271+
// SyntaxKind.ElementAccessExpression - `thing["aField"] = 42;` or `thing["aField"];` (with a doc comment on it)
29272+
// or SyntaxKind.PropertyAccessExpression - `thing.aField = 42;`
29273+
// all of which are pretty much always values, or at least imply a value meaning.
29274+
// It may be apprpriate to treat these as aliases in the future.
2926829275
return DeclarationSpaces.ExportValue;
2926929276
default:
2927029277
return Debug.failBadSyntaxKind(d);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
=== tests/cases/compiler/jsFileESModuleWithEnumTag.js ===
2+
export {}; // mark as module
3+
/** @enum {number} */
4+
const ChangeDetectionStrategy = {
5+
>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more)
6+
7+
OnPush: 0,
8+
>OnPush : Symbol(OnPush, Decl(jsFileESModuleWithEnumTag.js, 2, 33))
9+
10+
Default: 1,
11+
>Default : Symbol(Default, Decl(jsFileESModuleWithEnumTag.js, 3, 12))
12+
13+
};
14+
ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush';
15+
>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more)
16+
>ChangeDetectionStrategy.OnPush : Symbol(OnPush, Decl(jsFileESModuleWithEnumTag.js, 2, 33))
17+
>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more)
18+
>OnPush : Symbol(OnPush, Decl(jsFileESModuleWithEnumTag.js, 2, 33))
19+
20+
ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default';
21+
>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more)
22+
>ChangeDetectionStrategy.Default : Symbol(Default, Decl(jsFileESModuleWithEnumTag.js, 3, 12))
23+
>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more)
24+
>Default : Symbol(Default, Decl(jsFileESModuleWithEnumTag.js, 3, 12))
25+
26+
Object.defineProperty(ChangeDetectionStrategy, "aField", {value: 42});
27+
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
28+
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
29+
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
30+
>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more)
31+
>"aField" : Symbol(ChangeDetectionStrategy.aField, Decl(jsFileESModuleWithEnumTag.js, 7, 69))
32+
>value : Symbol(value, Decl(jsFileESModuleWithEnumTag.js, 8, 58))
33+
34+
/** @type {number} */
35+
ChangeDetectionStrategy["bField"];
36+
>ChangeDetectionStrategy : Symbol(ChangeDetectionStrategy, Decl(jsFileESModuleWithEnumTag.js, 2, 5), Decl(jsFileESModuleWithEnumTag.js, 5, 2), Decl(jsFileESModuleWithEnumTag.js, 6, 67), Decl(jsFileESModuleWithEnumTag.js, 8, 22), Decl(jsFileESModuleWithEnumTag.js, 8, 70) ... and 1 more)
37+
38+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
=== tests/cases/compiler/jsFileESModuleWithEnumTag.js ===
2+
export {}; // mark as module
3+
/** @enum {number} */
4+
const ChangeDetectionStrategy = {
5+
>ChangeDetectionStrategy : { OnPush: number; Default: number; }
6+
>{ OnPush: 0, Default: 1,} : { OnPush: number; Default: number; }
7+
8+
OnPush: 0,
9+
>OnPush : number
10+
>0 : 0
11+
12+
Default: 1,
13+
>Default : number
14+
>1 : 1
15+
16+
};
17+
ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush';
18+
>ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush' : "OnPush"
19+
>ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] : error
20+
>ChangeDetectionStrategy : { OnPush: number; Default: number; }
21+
>ChangeDetectionStrategy.OnPush : number
22+
>ChangeDetectionStrategy : { OnPush: number; Default: number; }
23+
>OnPush : number
24+
>'OnPush' : "OnPush"
25+
26+
ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default';
27+
>ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default' : "Default"
28+
>ChangeDetectionStrategy[ChangeDetectionStrategy.Default] : error
29+
>ChangeDetectionStrategy : { OnPush: number; Default: number; }
30+
>ChangeDetectionStrategy.Default : number
31+
>ChangeDetectionStrategy : { OnPush: number; Default: number; }
32+
>Default : number
33+
>'Default' : "Default"
34+
35+
Object.defineProperty(ChangeDetectionStrategy, "aField", {value: 42});
36+
>Object.defineProperty(ChangeDetectionStrategy, "aField", {value: 42}) : any
37+
>Object.defineProperty : (o: any, p: string | number | symbol, attributes: PropertyDescriptor & ThisType<any>) => any
38+
>Object : ObjectConstructor
39+
>defineProperty : (o: any, p: string | number | symbol, attributes: PropertyDescriptor & ThisType<any>) => any
40+
>ChangeDetectionStrategy : { OnPush: number; Default: number; }
41+
>"aField" : "aField"
42+
>{value: 42} : { value: number; }
43+
>value : number
44+
>42 : 42
45+
46+
/** @type {number} */
47+
ChangeDetectionStrategy["bField"];
48+
>ChangeDetectionStrategy["bField"] : error
49+
>ChangeDetectionStrategy : { OnPush: number; Default: number; }
50+
>"bField" : "bField"
51+
52+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @noEmit: true
4+
// @filename: jsFileESModuleWithEnumTag.js
5+
export {}; // mark as module
6+
/** @enum {number} */
7+
const ChangeDetectionStrategy = {
8+
OnPush: 0,
9+
Default: 1,
10+
};
11+
ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush';
12+
ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default';
13+
Object.defineProperty(ChangeDetectionStrategy, "aField", {value: 42});
14+
/** @type {number} */
15+
ChangeDetectionStrategy["bField"];
16+

0 commit comments

Comments
 (0)