Skip to content

Commit 587f9e0

Browse files
committed
More tests, only use computed name emit when all names are visible
1 parent 22c5c89 commit 587f9e0

File tree

45 files changed

+829
-169
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+829
-169
lines changed

Diff for: src/compiler/checker.ts

+18-22
Original file line numberDiff line numberDiff line change
@@ -7211,29 +7211,25 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
72117211
function indexInfoToObjectComputedNamesOrSignatureDeclaration(indexInfo: IndexInfo, context: NodeBuilderContext, typeNode: TypeNode | undefined): [IndexSignatureDeclaration] | PropertySignature[] {
72127212
if (indexInfo.components) {
72137213
// Index info is derived from object or class computed property names (plus explicit named members) - we can clone those instead of writing out the result computed index signature
7214-
let unusableResult = false;
7215-
const result = map(indexInfo.components, e => {
7216-
if (e.name && isComputedPropertyName(e.name) && isEntityNameExpression(e.name.expression)) {
7217-
trackComputedName(e.name.expression, context.enclosingDeclaration, context);
7218-
}
7219-
else {
7220-
// Computed name didn't take the form `[a.b.c]: something` - bail on using the computed name.
7221-
// TODO: Issue isolated declarations error on this fallback?
7222-
unusableResult = true;
7223-
}
7224-
return setTextRange(
7225-
context,
7226-
factory.createPropertySignature(
7227-
indexInfo.isReadonly ? [factory.createModifier(SyntaxKind.ReadonlyKeyword)] : undefined,
7228-
e.name,
7229-
/*questionToken*/ undefined,
7230-
typeNode || typeToTypeNodeHelper(getTypeOfSymbol(e.symbol), context),
7231-
),
7232-
e,
7233-
);
7214+
const allComponentComputedNamesSerializable = every(indexInfo.components, e => {
7215+
return !!(e.name && isComputedPropertyName(e.name) && isEntityNameExpression(e.name.expression) && context.enclosingDeclaration && isEntityNameVisible(e.name.expression, context.enclosingDeclaration, /*shouldComputeAliasToMakeVisible*/ false)?.accessibility === SymbolAccessibility.Accessible);
72347216
});
7235-
if (!unusableResult) {
7236-
return result;
7217+
if (allComponentComputedNamesSerializable) {
7218+
// Only use computed name serialization form if all components are visible and take the `a.b.c` form
7219+
return map(indexInfo.components, e => {
7220+
// Still need to track visibility even if we've already checked it to paint references as used
7221+
trackComputedName(e.name.expression as EntityNameExpression, context.enclosingDeclaration, context);
7222+
return setTextRange(
7223+
context,
7224+
factory.createPropertySignature(
7225+
indexInfo.isReadonly ? [factory.createModifier(SyntaxKind.ReadonlyKeyword)] : undefined,
7226+
e.name,
7227+
/*questionToken*/ undefined,
7228+
typeNode || typeToTypeNodeHelper(getTypeOfSymbol(e.symbol), context),
7229+
),
7230+
e,
7231+
);
7232+
});
72377233
}
72387234
}
72397235
return [indexInfoToIndexSignatureDeclarationHelper(indexInfo, context, typeNode)];

Diff for: tests/baselines/reference/FunctionDeclaration8_es6.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
=== FunctionDeclaration8_es6.ts ===
44
var v = { [yield]: foo }
5-
>v : { [yield]: any; }
6-
> : ^^ ^^^ ^^
7-
>{ [yield]: foo } : { [yield]: any; }
8-
> : ^^ ^^^ ^^
5+
>v : { [x: number]: any; }
6+
> : ^^^^^^^^^^^^^^^^^^^^^
7+
>{ [yield]: foo } : { [x: number]: any; }
8+
> : ^^^^^^^^^^^^^^^^^^^^^
99
>[yield] : any
1010
> : ^^^
1111
>yield : any

Diff for: tests/baselines/reference/asyncFunctionDeclaration8_es2017.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
=== asyncFunctionDeclaration8_es2017.ts ===
44
var v = { [await]: foo }
5-
>v : { [await]: any; }
6-
> : ^^ ^^^ ^^
7-
>{ [await]: foo } : { [await]: any; }
8-
> : ^^ ^^^ ^^
5+
>v : { [x: number]: any; }
6+
> : ^^^^^^^^^^^^^^^^^^^^^
7+
>{ [await]: foo } : { [x: number]: any; }
8+
> : ^^^^^^^^^^^^^^^^^^^^^
99
>[await] : any
1010
> : ^^^
1111
>await : any

Diff for: tests/baselines/reference/asyncFunctionDeclaration8_es5.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
=== asyncFunctionDeclaration8_es5.ts ===
44
var v = { [await]: foo }
5-
>v : { [await]: any; }
6-
> : ^^ ^^^ ^^
7-
>{ [await]: foo } : { [await]: any; }
8-
> : ^^ ^^^ ^^
5+
>v : { [x: number]: any; }
6+
> : ^^^^^^^^^^^^^^^^^^^^^
7+
>{ [await]: foo } : { [x: number]: any; }
8+
> : ^^^^^^^^^^^^^^^^^^^^^
99
>[await] : any
1010
> : ^^^
1111
>await : any

Diff for: tests/baselines/reference/asyncFunctionDeclaration8_es6.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
=== asyncFunctionDeclaration8_es6.ts ===
44
var v = { [await]: foo }
5-
>v : { [await]: any; }
6-
> : ^^ ^^^ ^^
7-
>{ [await]: foo } : { [await]: any; }
8-
> : ^^ ^^^ ^^
5+
>v : { [x: number]: any; }
6+
> : ^^^^^^^^^^^^^^^^^^^^^
7+
>{ [await]: foo } : { [x: number]: any; }
8+
> : ^^^^^^^^^^^^^^^^^^^^^
99
>[await] : any
1010
> : ^^^
1111
>await : any

Diff for: tests/baselines/reference/complicatedPrivacy.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ module m1 {
8686
export function f4(arg1:
8787
>f4 : (arg1: { [number]: C1; }) => void
8888
> : ^ ^^ ^^^^^^^^^
89-
>arg1 : { [number]: C1; }
90-
> : ^^ ^^ ^^
89+
>arg1 : { [x: number]: C1; }
90+
> : ^^^^^^^^^^^^^^^^^^^^
9191
{
9292
[number]: C1; // Used to be indexer, now it is a computed property
9393
>[number] : C1

Diff for: tests/baselines/reference/computedPropertyNames51_ES5.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ function f<T, K extends keyof T>() {
1414
> : ^
1515

1616
var v = {
17-
>v : { [t]: number; [k]: number; }
18-
> : ^^ ^^^^^^ ^ ^^^^^^ ^^
19-
>{ [t]: 0, [k]: 1 } : { [t]: number; [k]: number; }
20-
> : ^^ ^^^^^^ ^ ^^^^^^ ^^
17+
>v : { [x: string]: number; }
18+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
19+
>{ [t]: 0, [k]: 1 } : { [x: string]: number; }
20+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
2121

2222
[t]: 0,
2323
>[t] : number

Diff for: tests/baselines/reference/computedPropertyNames51_ES6.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ function f<T, K extends keyof T>() {
1414
> : ^
1515

1616
var v = {
17-
>v : { [t]: number; [k]: number; }
18-
> : ^^ ^^^^^^ ^ ^^^^^^ ^^
19-
>{ [t]: 0, [k]: 1 } : { [t]: number; [k]: number; }
20-
> : ^^ ^^^^^^ ^ ^^^^^^ ^^
17+
>v : { [x: string]: number; }
18+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
19+
>{ [t]: 0, [k]: 1 } : { [x: string]: number; }
20+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
2121

2222
[t]: 0,
2323
>[t] : number

Diff for: tests/baselines/reference/computedPropertyNames8_ES5.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ function f<T, U extends string>() {
1414
> : ^
1515

1616
var v = {
17-
>v : { [t]: number; [u]: number; }
18-
> : ^^ ^^^^^^ ^ ^^^^^^ ^^
19-
>{ [t]: 0, [u]: 1 } : { [t]: number; [u]: number; }
20-
> : ^^ ^^^^^^ ^ ^^^^^^ ^^
17+
>v : { [x: string]: number; }
18+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
19+
>{ [t]: 0, [u]: 1 } : { [x: string]: number; }
20+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
2121

2222
[t]: 0,
2323
>[t] : number

Diff for: tests/baselines/reference/computedPropertyNames8_ES6.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ function f<T, U extends string>() {
1414
> : ^
1515

1616
var v = {
17-
>v : { [t]: number; [u]: number; }
18-
> : ^^ ^^^^^^ ^ ^^^^^^ ^^
19-
>{ [t]: 0, [u]: 1 } : { [t]: number; [u]: number; }
20-
> : ^^ ^^^^^^ ^ ^^^^^^ ^^
17+
>v : { [x: string]: number; }
18+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
19+
>{ [t]: 0, [u]: 1 } : { [x: string]: number; }
20+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
2121

2222
[t]: 0,
2323
>[t] : number
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//// [tests/cases/compiler/declarationEmitComputedNamesInaccessible.ts] ////
2+
3+
//// [declarationEmitComputedNamesInaccessible.ts]
4+
export function f1() {
5+
const localClassFieldName = Math.random() > 0.5 ? "g1" : "g2";
6+
const localOtherField = localClassFieldName === "g1" ? "g2" : "g1";
7+
const localStaticField = Math.random() > 0.5 ? "s1" : "s2";
8+
return class ParameterizedHolder {
9+
[localClassFieldName]() {
10+
return "value";
11+
}
12+
[localOtherField]() {
13+
return 42;
14+
}
15+
static [localStaticField]() {
16+
return { static: true };
17+
}
18+
static [localStaticField]() {
19+
return { static: "sometimes" };
20+
}
21+
}
22+
}
23+
24+
//// [declarationEmitComputedNamesInaccessible.js]
25+
"use strict";
26+
Object.defineProperty(exports, "__esModule", { value: true });
27+
exports.f1 = f1;
28+
function f1() {
29+
var localClassFieldName = Math.random() > 0.5 ? "g1" : "g2";
30+
var localOtherField = localClassFieldName === "g1" ? "g2" : "g1";
31+
var localStaticField = Math.random() > 0.5 ? "s1" : "s2";
32+
return /** @class */ (function () {
33+
function ParameterizedHolder() {
34+
}
35+
ParameterizedHolder.prototype[localClassFieldName] = function () {
36+
return "value";
37+
};
38+
ParameterizedHolder.prototype[localOtherField] = function () {
39+
return 42;
40+
};
41+
ParameterizedHolder[localStaticField] = function () {
42+
return { static: true };
43+
};
44+
ParameterizedHolder[localStaticField] = function () {
45+
return { static: "sometimes" };
46+
};
47+
return ParameterizedHolder;
48+
}());
49+
}
50+
51+
52+
//// [declarationEmitComputedNamesInaccessible.d.ts]
53+
export declare function f1(): {
54+
new (): {
55+
[x: string]: (() => string) | (() => number);
56+
};
57+
[x: string]: {
58+
[x: string]: (() => string) | (() => number);
59+
} | (() => {
60+
static: boolean;
61+
}) | (() => {
62+
static: string;
63+
});
64+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//// [tests/cases/compiler/declarationEmitComputedNamesInaccessible.ts] ////
2+
3+
=== declarationEmitComputedNamesInaccessible.ts ===
4+
export function f1() {
5+
>f1 : Symbol(f1, Decl(declarationEmitComputedNamesInaccessible.ts, 0, 0))
6+
7+
const localClassFieldName = Math.random() > 0.5 ? "g1" : "g2";
8+
>localClassFieldName : Symbol(localClassFieldName, Decl(declarationEmitComputedNamesInaccessible.ts, 1, 9))
9+
>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
10+
>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
11+
>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
12+
13+
const localOtherField = localClassFieldName === "g1" ? "g2" : "g1";
14+
>localOtherField : Symbol(localOtherField, Decl(declarationEmitComputedNamesInaccessible.ts, 2, 9))
15+
>localClassFieldName : Symbol(localClassFieldName, Decl(declarationEmitComputedNamesInaccessible.ts, 1, 9))
16+
17+
const localStaticField = Math.random() > 0.5 ? "s1" : "s2";
18+
>localStaticField : Symbol(localStaticField, Decl(declarationEmitComputedNamesInaccessible.ts, 3, 9))
19+
>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
20+
>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
21+
>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
22+
23+
return class ParameterizedHolder {
24+
>ParameterizedHolder : Symbol(ParameterizedHolder, Decl(declarationEmitComputedNamesInaccessible.ts, 4, 10))
25+
26+
[localClassFieldName]() {
27+
>[localClassFieldName] : Symbol(ParameterizedHolder[localClassFieldName], Decl(declarationEmitComputedNamesInaccessible.ts, 4, 38))
28+
>localClassFieldName : Symbol(localClassFieldName, Decl(declarationEmitComputedNamesInaccessible.ts, 1, 9))
29+
30+
return "value";
31+
}
32+
[localOtherField]() {
33+
>[localOtherField] : Symbol(ParameterizedHolder[localOtherField], Decl(declarationEmitComputedNamesInaccessible.ts, 7, 9))
34+
>localOtherField : Symbol(localOtherField, Decl(declarationEmitComputedNamesInaccessible.ts, 2, 9))
35+
36+
return 42;
37+
}
38+
static [localStaticField]() {
39+
>[localStaticField] : Symbol(ParameterizedHolder[localStaticField], Decl(declarationEmitComputedNamesInaccessible.ts, 10, 9))
40+
>localStaticField : Symbol(localStaticField, Decl(declarationEmitComputedNamesInaccessible.ts, 3, 9))
41+
42+
return { static: true };
43+
>static : Symbol(static, Decl(declarationEmitComputedNamesInaccessible.ts, 12, 20))
44+
}
45+
static [localStaticField]() {
46+
>[localStaticField] : Symbol(ParameterizedHolder[localStaticField], Decl(declarationEmitComputedNamesInaccessible.ts, 13, 9))
47+
>localStaticField : Symbol(localStaticField, Decl(declarationEmitComputedNamesInaccessible.ts, 3, 9))
48+
49+
return { static: "sometimes" };
50+
>static : Symbol(static, Decl(declarationEmitComputedNamesInaccessible.ts, 15, 20))
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)