Skip to content

Commit 8c7a9cc

Browse files
authored
Merge pull request microsoft#24811 from Microsoft/computedPropertyNameWithDefaultImport
Always resolve the first identifier of computed property name to get the symbol and track it
2 parents e821d61 + 5d70d92 commit 8c7a9cc

9 files changed

+331
-3
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3533,9 +3533,13 @@ namespace ts {
35333533
context.enclosingDeclaration = undefined;
35343534
if (getCheckFlags(propertySymbol) & CheckFlags.Late) {
35353535
const decl = first(propertySymbol.declarations);
3536-
const name = hasLateBindableName(decl) && resolveEntityName(decl.name.expression, SymbolFlags.Value);
3537-
if (name && context.tracker.trackSymbol) {
3538-
context.tracker.trackSymbol(name, saveEnclosingDeclaration, SymbolFlags.Value);
3536+
if (context.tracker.trackSymbol && hasLateBindableName(decl)) {
3537+
// get symbol of the first identifier of the entityName
3538+
const firstIdentifier = getFirstIdentifier(decl.name.expression);
3539+
const name = resolveName(firstIdentifier, firstIdentifier.escapedText, SymbolFlags.Value | SymbolFlags.ExportValue, /*nodeNotFoundErrorMessage*/ undefined, /*nameArg*/ undefined, /*isUse*/ true);
3540+
if (name) {
3541+
context.tracker.trackSymbol(name, saveEnclosingDeclaration, SymbolFlags.Value);
3542+
}
35393543
}
35403544
}
35413545
const propertyName = symbolToName(propertySymbol, context, SymbolFlags.Value, /*expectsIdentifier*/ true);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//// [tests/cases/compiler/declarationEmitWithDefaultAsComputedName.ts] ////
2+
3+
//// [other.ts]
4+
type Experiment<Name> = {
5+
name: Name;
6+
};
7+
declare const createExperiment: <Name extends string>(
8+
options: Experiment<Name>
9+
) => Experiment<Name>;
10+
export default createExperiment({
11+
name: "foo"
12+
});
13+
14+
//// [main.ts]
15+
import other from "./other";
16+
export const obj = {
17+
[other.name]: 1,
18+
};
19+
20+
//// [other.js]
21+
"use strict";
22+
Object.defineProperty(exports, "__esModule", { value: true });
23+
exports.default = createExperiment({
24+
name: "foo"
25+
});
26+
//// [main.js]
27+
"use strict";
28+
Object.defineProperty(exports, "__esModule", { value: true });
29+
var _a;
30+
var other_1 = require("./other");
31+
exports.obj = (_a = {},
32+
_a[other_1.default.name] = 1,
33+
_a);
34+
35+
36+
//// [other.d.ts]
37+
declare type Experiment<Name> = {
38+
name: Name;
39+
};
40+
declare const _default: Experiment<"foo">;
41+
export default _default;
42+
//// [main.d.ts]
43+
import other from "./other";
44+
export declare const obj: {
45+
[other.name]: number;
46+
};
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
=== tests/cases/compiler/other.ts ===
2+
type Experiment<Name> = {
3+
>Experiment : Symbol(Experiment, Decl(other.ts, 0, 0))
4+
>Name : Symbol(Name, Decl(other.ts, 0, 16))
5+
6+
name: Name;
7+
>name : Symbol(name, Decl(other.ts, 0, 25))
8+
>Name : Symbol(Name, Decl(other.ts, 0, 16))
9+
10+
};
11+
declare const createExperiment: <Name extends string>(
12+
>createExperiment : Symbol(createExperiment, Decl(other.ts, 3, 13))
13+
>Name : Symbol(Name, Decl(other.ts, 3, 33))
14+
15+
options: Experiment<Name>
16+
>options : Symbol(options, Decl(other.ts, 3, 54))
17+
>Experiment : Symbol(Experiment, Decl(other.ts, 0, 0))
18+
>Name : Symbol(Name, Decl(other.ts, 3, 33))
19+
20+
) => Experiment<Name>;
21+
>Experiment : Symbol(Experiment, Decl(other.ts, 0, 0))
22+
>Name : Symbol(Name, Decl(other.ts, 3, 33))
23+
24+
export default createExperiment({
25+
>createExperiment : Symbol(createExperiment, Decl(other.ts, 3, 13))
26+
27+
name: "foo"
28+
>name : Symbol(name, Decl(other.ts, 6, 33))
29+
30+
});
31+
32+
=== tests/cases/compiler/main.ts ===
33+
import other from "./other";
34+
>other : Symbol(other, Decl(main.ts, 0, 6))
35+
36+
export const obj = {
37+
>obj : Symbol(obj, Decl(main.ts, 1, 12))
38+
39+
[other.name]: 1,
40+
>[other.name] : Symbol([other.name], Decl(main.ts, 1, 20))
41+
>other.name : Symbol(name, Decl(other.ts, 0, 25))
42+
>other : Symbol(other, Decl(main.ts, 0, 6))
43+
>name : Symbol(name, Decl(other.ts, 0, 25))
44+
45+
};
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
=== tests/cases/compiler/other.ts ===
2+
type Experiment<Name> = {
3+
>Experiment : Experiment<Name>
4+
>Name : Name
5+
6+
name: Name;
7+
>name : Name
8+
>Name : Name
9+
10+
};
11+
declare const createExperiment: <Name extends string>(
12+
>createExperiment : <Name extends string>(options: Experiment<Name>) => Experiment<Name>
13+
>Name : Name
14+
15+
options: Experiment<Name>
16+
>options : Experiment<Name>
17+
>Experiment : Experiment<Name>
18+
>Name : Name
19+
20+
) => Experiment<Name>;
21+
>Experiment : Experiment<Name>
22+
>Name : Name
23+
24+
export default createExperiment({
25+
>createExperiment({ name: "foo"}) : Experiment<"foo">
26+
>createExperiment : <Name extends string>(options: Experiment<Name>) => Experiment<Name>
27+
>{ name: "foo"} : { name: "foo"; }
28+
29+
name: "foo"
30+
>name : "foo"
31+
>"foo" : "foo"
32+
33+
});
34+
35+
=== tests/cases/compiler/main.ts ===
36+
import other from "./other";
37+
>other : { name: "foo"; }
38+
39+
export const obj = {
40+
>obj : { [other.name]: number; }
41+
>{ [other.name]: 1,} : { [other.name]: number; }
42+
43+
[other.name]: 1,
44+
>[other.name] : number
45+
>other.name : "foo"
46+
>other : { name: "foo"; }
47+
>name : "foo"
48+
>1 : 1
49+
50+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//// [tests/cases/compiler/declarationEmitWithDefaultAsComputedName2.ts] ////
2+
3+
//// [other.ts]
4+
type Experiment<Name> = {
5+
name: Name;
6+
};
7+
declare const createExperiment: <Name extends string>(
8+
options: Experiment<Name>
9+
) => Experiment<Name>;
10+
export default createExperiment({
11+
name: "foo"
12+
});
13+
14+
//// [main.ts]
15+
import * as other2 from "./other";
16+
export const obj = {
17+
[other2.default.name]: 1
18+
};
19+
20+
//// [other.js]
21+
"use strict";
22+
Object.defineProperty(exports, "__esModule", { value: true });
23+
exports.default = createExperiment({
24+
name: "foo"
25+
});
26+
//// [main.js]
27+
"use strict";
28+
Object.defineProperty(exports, "__esModule", { value: true });
29+
var _a;
30+
var other2 = require("./other");
31+
exports.obj = (_a = {},
32+
_a[other2.default.name] = 1,
33+
_a);
34+
35+
36+
//// [other.d.ts]
37+
declare type Experiment<Name> = {
38+
name: Name;
39+
};
40+
declare const _default: Experiment<"foo">;
41+
export default _default;
42+
//// [main.d.ts]
43+
import * as other2 from "./other";
44+
export declare const obj: {
45+
[other2.default.name]: number;
46+
};
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
=== tests/cases/compiler/other.ts ===
2+
type Experiment<Name> = {
3+
>Experiment : Symbol(Experiment, Decl(other.ts, 0, 0))
4+
>Name : Symbol(Name, Decl(other.ts, 0, 16))
5+
6+
name: Name;
7+
>name : Symbol(name, Decl(other.ts, 0, 25))
8+
>Name : Symbol(Name, Decl(other.ts, 0, 16))
9+
10+
};
11+
declare const createExperiment: <Name extends string>(
12+
>createExperiment : Symbol(createExperiment, Decl(other.ts, 3, 13))
13+
>Name : Symbol(Name, Decl(other.ts, 3, 33))
14+
15+
options: Experiment<Name>
16+
>options : Symbol(options, Decl(other.ts, 3, 54))
17+
>Experiment : Symbol(Experiment, Decl(other.ts, 0, 0))
18+
>Name : Symbol(Name, Decl(other.ts, 3, 33))
19+
20+
) => Experiment<Name>;
21+
>Experiment : Symbol(Experiment, Decl(other.ts, 0, 0))
22+
>Name : Symbol(Name, Decl(other.ts, 3, 33))
23+
24+
export default createExperiment({
25+
>createExperiment : Symbol(createExperiment, Decl(other.ts, 3, 13))
26+
27+
name: "foo"
28+
>name : Symbol(name, Decl(other.ts, 6, 33))
29+
30+
});
31+
32+
=== tests/cases/compiler/main.ts ===
33+
import * as other2 from "./other";
34+
>other2 : Symbol(other2, Decl(main.ts, 0, 6))
35+
36+
export const obj = {
37+
>obj : Symbol(obj, Decl(main.ts, 1, 12))
38+
39+
[other2.default.name]: 1
40+
>[other2.default.name] : Symbol([other2.default.name], Decl(main.ts, 1, 20))
41+
>other2.default.name : Symbol(name, Decl(other.ts, 0, 25))
42+
>other2.default : Symbol(other2.default, Decl(other.ts, 5, 22))
43+
>other2 : Symbol(other2, Decl(main.ts, 0, 6))
44+
>default : Symbol(other2.default, Decl(other.ts, 5, 22))
45+
>name : Symbol(name, Decl(other.ts, 0, 25))
46+
47+
};
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
=== tests/cases/compiler/other.ts ===
2+
type Experiment<Name> = {
3+
>Experiment : Experiment<Name>
4+
>Name : Name
5+
6+
name: Name;
7+
>name : Name
8+
>Name : Name
9+
10+
};
11+
declare const createExperiment: <Name extends string>(
12+
>createExperiment : <Name extends string>(options: Experiment<Name>) => Experiment<Name>
13+
>Name : Name
14+
15+
options: Experiment<Name>
16+
>options : Experiment<Name>
17+
>Experiment : Experiment<Name>
18+
>Name : Name
19+
20+
) => Experiment<Name>;
21+
>Experiment : Experiment<Name>
22+
>Name : Name
23+
24+
export default createExperiment({
25+
>createExperiment({ name: "foo"}) : Experiment<"foo">
26+
>createExperiment : <Name extends string>(options: Experiment<Name>) => Experiment<Name>
27+
>{ name: "foo"} : { name: "foo"; }
28+
29+
name: "foo"
30+
>name : "foo"
31+
>"foo" : "foo"
32+
33+
});
34+
35+
=== tests/cases/compiler/main.ts ===
36+
import * as other2 from "./other";
37+
>other2 : typeof other2
38+
39+
export const obj = {
40+
>obj : { [other2.default.name]: number; }
41+
>{ [other2.default.name]: 1} : { [other2.default.name]: number; }
42+
43+
[other2.default.name]: 1
44+
>[other2.default.name] : number
45+
>other2.default.name : "foo"
46+
>other2.default : { name: "foo"; }
47+
>other2 : typeof other2
48+
>default : { name: "foo"; }
49+
>name : "foo"
50+
>1 : 1
51+
52+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @declaration: true
2+
// @target: es5
3+
4+
// @filename: other.ts
5+
type Experiment<Name> = {
6+
name: Name;
7+
};
8+
declare const createExperiment: <Name extends string>(
9+
options: Experiment<Name>
10+
) => Experiment<Name>;
11+
export default createExperiment({
12+
name: "foo"
13+
});
14+
15+
// @filename: main.ts
16+
import other from "./other";
17+
export const obj = {
18+
[other.name]: 1,
19+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @declaration: true
2+
// @target: es5
3+
4+
// @filename: other.ts
5+
type Experiment<Name> = {
6+
name: Name;
7+
};
8+
declare const createExperiment: <Name extends string>(
9+
options: Experiment<Name>
10+
) => Experiment<Name>;
11+
export default createExperiment({
12+
name: "foo"
13+
});
14+
15+
// @filename: main.ts
16+
import * as other2 from "./other";
17+
export const obj = {
18+
[other2.default.name]: 1
19+
};

0 commit comments

Comments
 (0)