diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8dce8fb8f15b0..45f768a02f472 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7211,29 +7211,25 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function indexInfoToObjectComputedNamesOrSignatureDeclaration(indexInfo: IndexInfo, context: NodeBuilderContext, typeNode: TypeNode | undefined): [IndexSignatureDeclaration] | PropertySignature[] { if (indexInfo.components) { // 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 - let unusableResult = false; - const result = map(indexInfo.components, e => { - if (e.name && isComputedPropertyName(e.name) && isEntityNameExpression(e.name.expression)) { - trackComputedName(e.name.expression, context.enclosingDeclaration, context); - } - else { - // Computed name didn't take the form `[a.b.c]: something` - bail on using the computed name. - // TODO: Issue isolated declarations error on this fallback? - unusableResult = true; - } - return setTextRange( - context, - factory.createPropertySignature( - indexInfo.isReadonly ? [factory.createModifier(SyntaxKind.ReadonlyKeyword)] : undefined, - e.name, - /*questionToken*/ undefined, - typeNode || typeToTypeNodeHelper(getTypeOfSymbol(e.symbol), context), - ), - e, - ); + const allComponentComputedNamesSerializable = every(indexInfo.components, e => { + return !!(e.name && isComputedPropertyName(e.name) && isEntityNameExpression(e.name.expression) && context.enclosingDeclaration && isEntityNameVisible(e.name.expression, context.enclosingDeclaration, /*shouldComputeAliasToMakeVisible*/ false)?.accessibility === SymbolAccessibility.Accessible); }); - if (!unusableResult) { - return result; + if (allComponentComputedNamesSerializable) { + // Only use computed name serialization form if all components are visible and take the `a.b.c` form + return map(indexInfo.components, e => { + // Still need to track visibility even if we've already checked it to paint references as used + trackComputedName(e.name.expression as EntityNameExpression, context.enclosingDeclaration, context); + return setTextRange( + context, + factory.createPropertySignature( + indexInfo.isReadonly ? [factory.createModifier(SyntaxKind.ReadonlyKeyword)] : undefined, + e.name, + /*questionToken*/ undefined, + typeNode || typeToTypeNodeHelper(getTypeOfSymbol(e.symbol), context), + ), + e, + ); + }); } } return [indexInfoToIndexSignatureDeclarationHelper(indexInfo, context, typeNode)]; diff --git a/tests/baselines/reference/FunctionDeclaration8_es6.types b/tests/baselines/reference/FunctionDeclaration8_es6.types index cd7c8aaeba4a2..c92f5bcf908b2 100644 --- a/tests/baselines/reference/FunctionDeclaration8_es6.types +++ b/tests/baselines/reference/FunctionDeclaration8_es6.types @@ -2,10 +2,10 @@ === FunctionDeclaration8_es6.ts === var v = { [yield]: foo } ->v : { [yield]: any; } -> : ^^ ^^^ ^^ ->{ [yield]: foo } : { [yield]: any; } -> : ^^ ^^^ ^^ +>v : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ +>{ [yield]: foo } : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ >[yield] : any > : ^^^ >yield : any diff --git a/tests/baselines/reference/asyncFunctionDeclaration8_es2017.types b/tests/baselines/reference/asyncFunctionDeclaration8_es2017.types index 007cd1d7532be..77abe84bbb79a 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration8_es2017.types +++ b/tests/baselines/reference/asyncFunctionDeclaration8_es2017.types @@ -2,10 +2,10 @@ === asyncFunctionDeclaration8_es2017.ts === var v = { [await]: foo } ->v : { [await]: any; } -> : ^^ ^^^ ^^ ->{ [await]: foo } : { [await]: any; } -> : ^^ ^^^ ^^ +>v : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ +>{ [await]: foo } : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ >[await] : any > : ^^^ >await : any diff --git a/tests/baselines/reference/asyncFunctionDeclaration8_es5.types b/tests/baselines/reference/asyncFunctionDeclaration8_es5.types index 5c13773b01066..39a38122aabda 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration8_es5.types +++ b/tests/baselines/reference/asyncFunctionDeclaration8_es5.types @@ -2,10 +2,10 @@ === asyncFunctionDeclaration8_es5.ts === var v = { [await]: foo } ->v : { [await]: any; } -> : ^^ ^^^ ^^ ->{ [await]: foo } : { [await]: any; } -> : ^^ ^^^ ^^ +>v : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ +>{ [await]: foo } : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ >[await] : any > : ^^^ >await : any diff --git a/tests/baselines/reference/asyncFunctionDeclaration8_es6.types b/tests/baselines/reference/asyncFunctionDeclaration8_es6.types index 1834f5381e6e5..822744bfb8278 100644 --- a/tests/baselines/reference/asyncFunctionDeclaration8_es6.types +++ b/tests/baselines/reference/asyncFunctionDeclaration8_es6.types @@ -2,10 +2,10 @@ === asyncFunctionDeclaration8_es6.ts === var v = { [await]: foo } ->v : { [await]: any; } -> : ^^ ^^^ ^^ ->{ [await]: foo } : { [await]: any; } -> : ^^ ^^^ ^^ +>v : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ +>{ [await]: foo } : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ >[await] : any > : ^^^ >await : any diff --git a/tests/baselines/reference/complicatedPrivacy.types b/tests/baselines/reference/complicatedPrivacy.types index 127114b38101f..d0ff49fdceaa8 100644 --- a/tests/baselines/reference/complicatedPrivacy.types +++ b/tests/baselines/reference/complicatedPrivacy.types @@ -86,8 +86,8 @@ module m1 { export function f4(arg1: >f4 : (arg1: { [number]: C1; }) => void > : ^ ^^ ^^^^^^^^^ ->arg1 : { [number]: C1; } -> : ^^ ^^ ^^ +>arg1 : { [x: number]: C1; } +> : ^^^^^^^^^^^^^^^^^^^^ { [number]: C1; // Used to be indexer, now it is a computed property >[number] : C1 diff --git a/tests/baselines/reference/computedPropertyNames51_ES5.types b/tests/baselines/reference/computedPropertyNames51_ES5.types index c601cf82b7d4d..c139cf77343d1 100644 --- a/tests/baselines/reference/computedPropertyNames51_ES5.types +++ b/tests/baselines/reference/computedPropertyNames51_ES5.types @@ -14,10 +14,10 @@ function f() { > : ^ var v = { ->v : { [t]: number; [k]: number; } -> : ^^ ^^^^^^ ^ ^^^^^^ ^^ ->{ [t]: 0, [k]: 1 } : { [t]: number; [k]: number; } -> : ^^ ^^^^^^ ^ ^^^^^^ ^^ +>v : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [t]: 0, [k]: 1 } : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ [t]: 0, >[t] : number diff --git a/tests/baselines/reference/computedPropertyNames51_ES6.types b/tests/baselines/reference/computedPropertyNames51_ES6.types index 50c57d90bbb25..3b4865b6608fe 100644 --- a/tests/baselines/reference/computedPropertyNames51_ES6.types +++ b/tests/baselines/reference/computedPropertyNames51_ES6.types @@ -14,10 +14,10 @@ function f() { > : ^ var v = { ->v : { [t]: number; [k]: number; } -> : ^^ ^^^^^^ ^ ^^^^^^ ^^ ->{ [t]: 0, [k]: 1 } : { [t]: number; [k]: number; } -> : ^^ ^^^^^^ ^ ^^^^^^ ^^ +>v : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [t]: 0, [k]: 1 } : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ [t]: 0, >[t] : number diff --git a/tests/baselines/reference/computedPropertyNames8_ES5.types b/tests/baselines/reference/computedPropertyNames8_ES5.types index 1604c7e7252db..7cdc03cf6167d 100644 --- a/tests/baselines/reference/computedPropertyNames8_ES5.types +++ b/tests/baselines/reference/computedPropertyNames8_ES5.types @@ -14,10 +14,10 @@ function f() { > : ^ var v = { ->v : { [t]: number; [u]: number; } -> : ^^ ^^^^^^ ^ ^^^^^^ ^^ ->{ [t]: 0, [u]: 1 } : { [t]: number; [u]: number; } -> : ^^ ^^^^^^ ^ ^^^^^^ ^^ +>v : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [t]: 0, [u]: 1 } : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ [t]: 0, >[t] : number diff --git a/tests/baselines/reference/computedPropertyNames8_ES6.types b/tests/baselines/reference/computedPropertyNames8_ES6.types index ca87aa8d3aa6a..11427d48dd2ee 100644 --- a/tests/baselines/reference/computedPropertyNames8_ES6.types +++ b/tests/baselines/reference/computedPropertyNames8_ES6.types @@ -14,10 +14,10 @@ function f() { > : ^ var v = { ->v : { [t]: number; [u]: number; } -> : ^^ ^^^^^^ ^ ^^^^^^ ^^ ->{ [t]: 0, [u]: 1 } : { [t]: number; [u]: number; } -> : ^^ ^^^^^^ ^ ^^^^^^ ^^ +>v : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [t]: 0, [u]: 1 } : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ [t]: 0, >[t] : number diff --git a/tests/baselines/reference/declarationEmitComputedNamesInaccessible.js b/tests/baselines/reference/declarationEmitComputedNamesInaccessible.js new file mode 100644 index 0000000000000..39a3113c03f08 --- /dev/null +++ b/tests/baselines/reference/declarationEmitComputedNamesInaccessible.js @@ -0,0 +1,64 @@ +//// [tests/cases/compiler/declarationEmitComputedNamesInaccessible.ts] //// + +//// [declarationEmitComputedNamesInaccessible.ts] +export function f1() { + const localClassFieldName = Math.random() > 0.5 ? "g1" : "g2"; + const localOtherField = localClassFieldName === "g1" ? "g2" : "g1"; + const localStaticField = Math.random() > 0.5 ? "s1" : "s2"; + return class ParameterizedHolder { + [localClassFieldName]() { + return "value"; + } + [localOtherField]() { + return 42; + } + static [localStaticField]() { + return { static: true }; + } + static [localStaticField]() { + return { static: "sometimes" }; + } + } +} + +//// [declarationEmitComputedNamesInaccessible.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.f1 = f1; +function f1() { + var localClassFieldName = Math.random() > 0.5 ? "g1" : "g2"; + var localOtherField = localClassFieldName === "g1" ? "g2" : "g1"; + var localStaticField = Math.random() > 0.5 ? "s1" : "s2"; + return /** @class */ (function () { + function ParameterizedHolder() { + } + ParameterizedHolder.prototype[localClassFieldName] = function () { + return "value"; + }; + ParameterizedHolder.prototype[localOtherField] = function () { + return 42; + }; + ParameterizedHolder[localStaticField] = function () { + return { static: true }; + }; + ParameterizedHolder[localStaticField] = function () { + return { static: "sometimes" }; + }; + return ParameterizedHolder; + }()); +} + + +//// [declarationEmitComputedNamesInaccessible.d.ts] +export declare function f1(): { + new (): { + [x: string]: (() => string) | (() => number); + }; + [x: string]: { + [x: string]: (() => string) | (() => number); + } | (() => { + static: boolean; + }) | (() => { + static: string; + }); +}; diff --git a/tests/baselines/reference/declarationEmitComputedNamesInaccessible.symbols b/tests/baselines/reference/declarationEmitComputedNamesInaccessible.symbols new file mode 100644 index 0000000000000..3e72a96d75a16 --- /dev/null +++ b/tests/baselines/reference/declarationEmitComputedNamesInaccessible.symbols @@ -0,0 +1,53 @@ +//// [tests/cases/compiler/declarationEmitComputedNamesInaccessible.ts] //// + +=== declarationEmitComputedNamesInaccessible.ts === +export function f1() { +>f1 : Symbol(f1, Decl(declarationEmitComputedNamesInaccessible.ts, 0, 0)) + + const localClassFieldName = Math.random() > 0.5 ? "g1" : "g2"; +>localClassFieldName : Symbol(localClassFieldName, Decl(declarationEmitComputedNamesInaccessible.ts, 1, 9)) +>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) +>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) + + const localOtherField = localClassFieldName === "g1" ? "g2" : "g1"; +>localOtherField : Symbol(localOtherField, Decl(declarationEmitComputedNamesInaccessible.ts, 2, 9)) +>localClassFieldName : Symbol(localClassFieldName, Decl(declarationEmitComputedNamesInaccessible.ts, 1, 9)) + + const localStaticField = Math.random() > 0.5 ? "s1" : "s2"; +>localStaticField : Symbol(localStaticField, Decl(declarationEmitComputedNamesInaccessible.ts, 3, 9)) +>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) +>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) + + return class ParameterizedHolder { +>ParameterizedHolder : Symbol(ParameterizedHolder, Decl(declarationEmitComputedNamesInaccessible.ts, 4, 10)) + + [localClassFieldName]() { +>[localClassFieldName] : Symbol(ParameterizedHolder[localClassFieldName], Decl(declarationEmitComputedNamesInaccessible.ts, 4, 38)) +>localClassFieldName : Symbol(localClassFieldName, Decl(declarationEmitComputedNamesInaccessible.ts, 1, 9)) + + return "value"; + } + [localOtherField]() { +>[localOtherField] : Symbol(ParameterizedHolder[localOtherField], Decl(declarationEmitComputedNamesInaccessible.ts, 7, 9)) +>localOtherField : Symbol(localOtherField, Decl(declarationEmitComputedNamesInaccessible.ts, 2, 9)) + + return 42; + } + static [localStaticField]() { +>[localStaticField] : Symbol(ParameterizedHolder[localStaticField], Decl(declarationEmitComputedNamesInaccessible.ts, 10, 9)) +>localStaticField : Symbol(localStaticField, Decl(declarationEmitComputedNamesInaccessible.ts, 3, 9)) + + return { static: true }; +>static : Symbol(static, Decl(declarationEmitComputedNamesInaccessible.ts, 12, 20)) + } + static [localStaticField]() { +>[localStaticField] : Symbol(ParameterizedHolder[localStaticField], Decl(declarationEmitComputedNamesInaccessible.ts, 13, 9)) +>localStaticField : Symbol(localStaticField, Decl(declarationEmitComputedNamesInaccessible.ts, 3, 9)) + + return { static: "sometimes" }; +>static : Symbol(static, Decl(declarationEmitComputedNamesInaccessible.ts, 15, 20)) + } + } +} diff --git a/tests/baselines/reference/declarationEmitComputedNamesInaccessible.types b/tests/baselines/reference/declarationEmitComputedNamesInaccessible.types new file mode 100644 index 0000000000000..4c04167fb0ab5 --- /dev/null +++ b/tests/baselines/reference/declarationEmitComputedNamesInaccessible.types @@ -0,0 +1,123 @@ +//// [tests/cases/compiler/declarationEmitComputedNamesInaccessible.ts] //// + +=== declarationEmitComputedNamesInaccessible.ts === +export function f1() { +>f1 : () => typeof ParameterizedHolder +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + const localClassFieldName = Math.random() > 0.5 ? "g1" : "g2"; +>localClassFieldName : "g1" | "g2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 ? "g1" : "g2" : "g1" | "g2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 : boolean +> : ^^^^^^^ +>Math.random() : number +> : ^^^^^^ +>Math.random : () => number +> : ^^^^^^ +>Math : Math +> : ^^^^ +>random : () => number +> : ^^^^^^ +>0.5 : 0.5 +> : ^^^ +>"g1" : "g1" +> : ^^^^ +>"g2" : "g2" +> : ^^^^ + + const localOtherField = localClassFieldName === "g1" ? "g2" : "g1"; +>localOtherField : "g1" | "g2" +> : ^^^^^^^^^^^ +>localClassFieldName === "g1" ? "g2" : "g1" : "g1" | "g2" +> : ^^^^^^^^^^^ +>localClassFieldName === "g1" : boolean +> : ^^^^^^^ +>localClassFieldName : "g1" | "g2" +> : ^^^^^^^^^^^ +>"g1" : "g1" +> : ^^^^ +>"g2" : "g2" +> : ^^^^ +>"g1" : "g1" +> : ^^^^ + + const localStaticField = Math.random() > 0.5 ? "s1" : "s2"; +>localStaticField : "s1" | "s2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 ? "s1" : "s2" : "s1" | "s2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 : boolean +> : ^^^^^^^ +>Math.random() : number +> : ^^^^^^ +>Math.random : () => number +> : ^^^^^^ +>Math : Math +> : ^^^^ +>random : () => number +> : ^^^^^^ +>0.5 : 0.5 +> : ^^^ +>"s1" : "s1" +> : ^^^^ +>"s2" : "s2" +> : ^^^^ + + return class ParameterizedHolder { +>class ParameterizedHolder { [localClassFieldName]() { return "value"; } [localOtherField]() { return 42; } static [localStaticField]() { return { static: true }; } static [localStaticField]() { return { static: "sometimes" }; } } : typeof ParameterizedHolder +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>ParameterizedHolder : typeof ParameterizedHolder +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + [localClassFieldName]() { +>[localClassFieldName] : () => string +> : ^^^^^^^^^^^^ +>localClassFieldName : "g1" | "g2" +> : ^^^^^^^^^^^ + + return "value"; +>"value" : "value" +> : ^^^^^^^ + } + [localOtherField]() { +>[localOtherField] : () => number +> : ^^^^^^^^^^^^ +>localOtherField : "g1" | "g2" +> : ^^^^^^^^^^^ + + return 42; +>42 : 42 +> : ^^ + } + static [localStaticField]() { +>[localStaticField] : () => { static: boolean; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>localStaticField : "s1" | "s2" +> : ^^^^^^^^^^^ + + return { static: true }; +>{ static: true } : { static: boolean; } +> : ^^^^^^^^^^^^^^^^^^^^ +>static : boolean +> : ^^^^^^^ +>true : true +> : ^^^^ + } + static [localStaticField]() { +>[localStaticField] : () => { static: string; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^ +>localStaticField : "s1" | "s2" +> : ^^^^^^^^^^^ + + return { static: "sometimes" }; +>{ static: "sometimes" } : { static: string; } +> : ^^^^^^^^^^^^^^^^^^^ +>static : string +> : ^^^^^^ +>"sometimes" : "sometimes" +> : ^^^^^^^^^^^ + } + } +} diff --git a/tests/baselines/reference/declarationEmitComputedPropertyNameEnum2.types b/tests/baselines/reference/declarationEmitComputedPropertyNameEnum2.types index f1340a7f264be..d1e82f6148633 100644 --- a/tests/baselines/reference/declarationEmitComputedPropertyNameEnum2.types +++ b/tests/baselines/reference/declarationEmitComputedPropertyNameEnum2.types @@ -4,8 +4,8 @@ export type Type = { x?: { [Enum.A]: 0 } }; >Type : Type > : ^^^^ ->x : { [Enum.A]: 0; } | undefined -> : ^^ ^ ^^^^^^^^^^^^^^ +>x : { [x: number]: 0; } | undefined +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >[Enum.A] : 0 > : ^ >Enum.A : any diff --git a/tests/baselines/reference/declarationEmitSimpleComputedNames1.js b/tests/baselines/reference/declarationEmitSimpleComputedNames1.js new file mode 100644 index 0000000000000..88a7c5ac1e91a --- /dev/null +++ b/tests/baselines/reference/declarationEmitSimpleComputedNames1.js @@ -0,0 +1,102 @@ +//// [tests/cases/compiler/declarationEmitSimpleComputedNames1.ts] //// + +//// [declarationEmitSimpleComputedNames1.ts] +export const fieldName = Math.random() > 0.5 ? "f1" : "f2"; +export const conatainer = { + [fieldName]() { + return "result"; + } +}; + +const classFieldName = Math.random() > 0.5 ? "g1" : "g2"; +const otherField = classFieldName === "g1" ? "g2" : "g1"; +const staticField = Math.random() > 0.5 ? "s1" : "s2"; +export class Holder { + [classFieldName]() { + return "value"; + } + [otherField]() { + return 42; + } + static [staticField]() { + return { static: true }; + } + static [staticField]() { + return { static: "sometimes" }; + } +} + +/** + * Could be `"prototype"`, so all static string indexers include the instance type + */ +export const staticLookup = Holder["some" + "thing"]; +export const instanceLookup = (new Holder())["some" + "thing"]; + + +//// [declarationEmitSimpleComputedNames1.js] +"use strict"; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.instanceLookup = exports.staticLookup = exports.Holder = exports.conatainer = exports.fieldName = void 0; +exports.fieldName = Math.random() > 0.5 ? "f1" : "f2"; +exports.conatainer = (_a = {}, + _a[exports.fieldName] = function () { + return "result"; + }, + _a); +var classFieldName = Math.random() > 0.5 ? "g1" : "g2"; +var otherField = classFieldName === "g1" ? "g2" : "g1"; +var staticField = Math.random() > 0.5 ? "s1" : "s2"; +var Holder = /** @class */ (function () { + function Holder() { + } + Holder.prototype[classFieldName] = function () { + return "value"; + }; + Holder.prototype[otherField] = function () { + return 42; + }; + Holder[staticField] = function () { + return { static: true }; + }; + Holder[staticField] = function () { + return { static: "sometimes" }; + }; + return Holder; +}()); +exports.Holder = Holder; +/** + * Could be `"prototype"`, so all static string indexers include the instance type + */ +exports.staticLookup = Holder["some" + "thing"]; +exports.instanceLookup = (new Holder())["some" + "thing"]; + + +//// [declarationEmitSimpleComputedNames1.d.ts] +export declare const fieldName: string; +export declare const conatainer: { + [fieldName]: () => string; +}; +declare const classFieldName: string; +declare const otherField: string; +declare const staticField: string; +export declare class Holder { + static [staticField]: () => { + static: boolean; + }; + static [staticField]: () => { + static: string; + }; + [classFieldName]: () => string; + [otherField]: () => number; +} +/** + * Could be `"prototype"`, so all static string indexers include the instance type + */ +export declare const staticLookup: Holder | (() => { + static: boolean; +}) | (() => { + static: string; +}); +export declare const instanceLookup: (() => string) | (() => number); +export {}; diff --git a/tests/baselines/reference/declarationEmitSimpleComputedNames1.symbols b/tests/baselines/reference/declarationEmitSimpleComputedNames1.symbols new file mode 100644 index 0000000000000..84580bb454992 --- /dev/null +++ b/tests/baselines/reference/declarationEmitSimpleComputedNames1.symbols @@ -0,0 +1,78 @@ +//// [tests/cases/compiler/declarationEmitSimpleComputedNames1.ts] //// + +=== declarationEmitSimpleComputedNames1.ts === +export const fieldName = Math.random() > 0.5 ? "f1" : "f2"; +>fieldName : Symbol(fieldName, Decl(declarationEmitSimpleComputedNames1.ts, 0, 12)) +>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) +>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) + +export const conatainer = { +>conatainer : Symbol(conatainer, Decl(declarationEmitSimpleComputedNames1.ts, 1, 12)) + + [fieldName]() { +>[fieldName] : Symbol([fieldName], Decl(declarationEmitSimpleComputedNames1.ts, 1, 27)) +>fieldName : Symbol(fieldName, Decl(declarationEmitSimpleComputedNames1.ts, 0, 12)) + + return "result"; + } +}; + +const classFieldName = Math.random() > 0.5 ? "g1" : "g2"; +>classFieldName : Symbol(classFieldName, Decl(declarationEmitSimpleComputedNames1.ts, 7, 5)) +>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) +>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) + +const otherField = classFieldName === "g1" ? "g2" : "g1"; +>otherField : Symbol(otherField, Decl(declarationEmitSimpleComputedNames1.ts, 8, 5)) +>classFieldName : Symbol(classFieldName, Decl(declarationEmitSimpleComputedNames1.ts, 7, 5)) + +const staticField = Math.random() > 0.5 ? "s1" : "s2"; +>staticField : Symbol(staticField, Decl(declarationEmitSimpleComputedNames1.ts, 9, 5)) +>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) +>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) + +export class Holder { +>Holder : Symbol(Holder, Decl(declarationEmitSimpleComputedNames1.ts, 9, 54)) + + [classFieldName]() { +>[classFieldName] : Symbol(Holder[classFieldName], Decl(declarationEmitSimpleComputedNames1.ts, 10, 21)) +>classFieldName : Symbol(classFieldName, Decl(declarationEmitSimpleComputedNames1.ts, 7, 5)) + + return "value"; + } + [otherField]() { +>[otherField] : Symbol(Holder[otherField], Decl(declarationEmitSimpleComputedNames1.ts, 13, 5)) +>otherField : Symbol(otherField, Decl(declarationEmitSimpleComputedNames1.ts, 8, 5)) + + return 42; + } + static [staticField]() { +>[staticField] : Symbol(Holder[staticField], Decl(declarationEmitSimpleComputedNames1.ts, 16, 5)) +>staticField : Symbol(staticField, Decl(declarationEmitSimpleComputedNames1.ts, 9, 5)) + + return { static: true }; +>static : Symbol(static, Decl(declarationEmitSimpleComputedNames1.ts, 18, 16)) + } + static [staticField]() { +>[staticField] : Symbol(Holder[staticField], Decl(declarationEmitSimpleComputedNames1.ts, 19, 5)) +>staticField : Symbol(staticField, Decl(declarationEmitSimpleComputedNames1.ts, 9, 5)) + + return { static: "sometimes" }; +>static : Symbol(static, Decl(declarationEmitSimpleComputedNames1.ts, 21, 16)) + } +} + +/** + * Could be `"prototype"`, so all static string indexers include the instance type + */ +export const staticLookup = Holder["some" + "thing"]; +>staticLookup : Symbol(staticLookup, Decl(declarationEmitSimpleComputedNames1.ts, 28, 12)) +>Holder : Symbol(Holder, Decl(declarationEmitSimpleComputedNames1.ts, 9, 54)) + +export const instanceLookup = (new Holder())["some" + "thing"]; +>instanceLookup : Symbol(instanceLookup, Decl(declarationEmitSimpleComputedNames1.ts, 29, 12)) +>Holder : Symbol(Holder, Decl(declarationEmitSimpleComputedNames1.ts, 9, 54)) + diff --git a/tests/baselines/reference/declarationEmitSimpleComputedNames1.types b/tests/baselines/reference/declarationEmitSimpleComputedNames1.types new file mode 100644 index 0000000000000..773301e49e9d7 --- /dev/null +++ b/tests/baselines/reference/declarationEmitSimpleComputedNames1.types @@ -0,0 +1,192 @@ +//// [tests/cases/compiler/declarationEmitSimpleComputedNames1.ts] //// + +=== declarationEmitSimpleComputedNames1.ts === +export const fieldName = Math.random() > 0.5 ? "f1" : "f2"; +>fieldName : "f1" | "f2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 ? "f1" : "f2" : "f1" | "f2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 : boolean +> : ^^^^^^^ +>Math.random() : number +> : ^^^^^^ +>Math.random : () => number +> : ^^^^^^ +>Math : Math +> : ^^^^ +>random : () => number +> : ^^^^^^ +>0.5 : 0.5 +> : ^^^ +>"f1" : "f1" +> : ^^^^ +>"f2" : "f2" +> : ^^^^ + +export const conatainer = { +>conatainer : { [fieldName]: () => string; } +> : ^^ ^^^^^^^^^^^^ ^^ +>{ [fieldName]() { return "result"; }} : { [fieldName]: () => string; } +> : ^^ ^^^^^^^^^^^^ ^^ + + [fieldName]() { +>[fieldName] : () => string +> : ^^^^^^^^^^^^ +>fieldName : "f1" | "f2" +> : ^^^^^^^^^^^ + + return "result"; +>"result" : "result" +> : ^^^^^^^^ + } +}; + +const classFieldName = Math.random() > 0.5 ? "g1" : "g2"; +>classFieldName : "g1" | "g2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 ? "g1" : "g2" : "g1" | "g2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 : boolean +> : ^^^^^^^ +>Math.random() : number +> : ^^^^^^ +>Math.random : () => number +> : ^^^^^^ +>Math : Math +> : ^^^^ +>random : () => number +> : ^^^^^^ +>0.5 : 0.5 +> : ^^^ +>"g1" : "g1" +> : ^^^^ +>"g2" : "g2" +> : ^^^^ + +const otherField = classFieldName === "g1" ? "g2" : "g1"; +>otherField : "g1" | "g2" +> : ^^^^^^^^^^^ +>classFieldName === "g1" ? "g2" : "g1" : "g1" | "g2" +> : ^^^^^^^^^^^ +>classFieldName === "g1" : boolean +> : ^^^^^^^ +>classFieldName : "g1" | "g2" +> : ^^^^^^^^^^^ +>"g1" : "g1" +> : ^^^^ +>"g2" : "g2" +> : ^^^^ +>"g1" : "g1" +> : ^^^^ + +const staticField = Math.random() > 0.5 ? "s1" : "s2"; +>staticField : "s1" | "s2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 ? "s1" : "s2" : "s1" | "s2" +> : ^^^^^^^^^^^ +>Math.random() > 0.5 : boolean +> : ^^^^^^^ +>Math.random() : number +> : ^^^^^^ +>Math.random : () => number +> : ^^^^^^ +>Math : Math +> : ^^^^ +>random : () => number +> : ^^^^^^ +>0.5 : 0.5 +> : ^^^ +>"s1" : "s1" +> : ^^^^ +>"s2" : "s2" +> : ^^^^ + +export class Holder { +>Holder : Holder +> : ^^^^^^ + + [classFieldName]() { +>[classFieldName] : () => string +> : ^^^^^^^^^^^^ +>classFieldName : "g1" | "g2" +> : ^^^^^^^^^^^ + + return "value"; +>"value" : "value" +> : ^^^^^^^ + } + [otherField]() { +>[otherField] : () => number +> : ^^^^^^^^^^^^ +>otherField : "g1" | "g2" +> : ^^^^^^^^^^^ + + return 42; +>42 : 42 +> : ^^ + } + static [staticField]() { +>[staticField] : () => { static: boolean; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>staticField : "s1" | "s2" +> : ^^^^^^^^^^^ + + return { static: true }; +>{ static: true } : { static: boolean; } +> : ^^^^^^^^^^^^^^^^^^^^ +>static : boolean +> : ^^^^^^^ +>true : true +> : ^^^^ + } + static [staticField]() { +>[staticField] : () => { static: string; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^ +>staticField : "s1" | "s2" +> : ^^^^^^^^^^^ + + return { static: "sometimes" }; +>{ static: "sometimes" } : { static: string; } +> : ^^^^^^^^^^^^^^^^^^^ +>static : string +> : ^^^^^^ +>"sometimes" : "sometimes" +> : ^^^^^^^^^^^ + } +} + +/** + * Could be `"prototype"`, so all static string indexers include the instance type + */ +export const staticLookup = Holder["some" + "thing"]; +>staticLookup : Holder | (() => { static: boolean; }) | (() => { static: string; }) +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>Holder["some" + "thing"] : Holder | (() => { static: boolean; }) | (() => { static: string; }) +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>Holder : typeof Holder +> : ^^^^^^^^^^^^^ +>"some" + "thing" : string +> : ^^^^^^ +>"some" : "some" +> : ^^^^^^ +>"thing" : "thing" +> : ^^^^^^^ + +export const instanceLookup = (new Holder())["some" + "thing"]; +>instanceLookup : (() => string) | (() => number) +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>(new Holder())["some" + "thing"] : (() => string) | (() => number) +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>(new Holder()) : Holder +> : ^^^^^^ +>new Holder() : Holder +> : ^^^^^^ +>Holder : typeof Holder +> : ^^^^^^^^^^^^^ +>"some" + "thing" : string +> : ^^^^^^ +>"some" : "some" +> : ^^^^^^ +>"thing" : "thing" +> : ^^^^^^^ + diff --git a/tests/baselines/reference/declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.types b/tests/baselines/reference/declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.types index d068a682feca6..183b707e18779 100644 --- a/tests/baselines/reference/declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.types +++ b/tests/baselines/reference/declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.types @@ -107,8 +107,8 @@ export const updateIfChanged = (t: T) => { > : ^ >update : (u: U) => T > : ^ ^^ ^^^^^ ->Object.assign(Array.isArray(u) ? [] : {}, u, { [key]: v }) : U & { [key]: Value; } -> : ^^^^^^ ^^^^^^^^^^^ ^^ +>Object.assign(Array.isArray(u) ? [] : {}, u, { [key]: v }) : U & { [x: string]: Value; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >Object.assign : { (target: T_1, source: U_1): T_1 & U_1; (target: T_1, source1: U_1, source2: V): T_1 & U_1 & V; (target: T_1, source1: U_1, source2: V, source3: W): T_1 & U_1 & V & W; (target: object, ...sources: any[]): any; } > : ^^^^^^^^^^^^^^^ ^^^^^^^ ^^ ^^ ^^ ^^^ ^^^^^^^^^^^^^^^ ^^^^^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^^^^^^^^^^^^^ ^^^^^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^ ^^^^^ ^^ ^^^ ^^^ >Object : ObjectConstructor @@ -133,8 +133,8 @@ export const updateIfChanged = (t: T) => { > : ^^ >u : U > : ^ ->{ [key]: v } : { [key]: Value; } -> : ^^ ^^^^^^^^^^^ ^^ +>{ [key]: v } : { [x: string]: Value; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >[key] : Value > : ^^^^^^^^^^^ >key : K diff --git a/tests/baselines/reference/duplicateObjectLiteralProperty_computedNameNegative1.types b/tests/baselines/reference/duplicateObjectLiteralProperty_computedNameNegative1.types index d96676d61ba05..3502ce16af34e 100644 --- a/tests/baselines/reference/duplicateObjectLiteralProperty_computedNameNegative1.types +++ b/tests/baselines/reference/duplicateObjectLiteralProperty_computedNameNegative1.types @@ -4,8 +4,8 @@ // repro from https://github.com/microsoft/TypeScript/issues/56341 function bar(props: { x?: string; y?: string }) { ->bar : (props: { x?: string; y?: string; }) => { [x]: number; [y]: number; } -> : ^ ^^ ^^^^^^^ ^^^^^^ ^ ^^^^^^ ^^ +>bar : (props: { x?: string; y?: string; }) => { [x: string]: number; } +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >props : { x?: string; y?: string; } > : ^^^^^^ ^^^^^^ ^^^ >x : string | undefined @@ -26,8 +26,8 @@ function bar(props: { x?: string; y?: string }) { > : ^^^^^^ ^^^^^^ ^^^ return { ->{ [x]: 1, [y]: 2, } : { [x]: number; [y]: number; } -> : ^^ ^^^^^^ ^ ^^^^^^ ^^ +>{ [x]: 1, [y]: 2, } : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ [x]: 1, >[x] : number diff --git a/tests/baselines/reference/modularizeLibrary_ErrorFromUsingES6FeaturesWithOnlyES5Lib.types b/tests/baselines/reference/modularizeLibrary_ErrorFromUsingES6FeaturesWithOnlyES5Lib.types index 47ad12d733368..7294263ded5ee 100644 --- a/tests/baselines/reference/modularizeLibrary_ErrorFromUsingES6FeaturesWithOnlyES5Lib.types +++ b/tests/baselines/reference/modularizeLibrary_ErrorFromUsingES6FeaturesWithOnlyES5Lib.types @@ -96,10 +96,10 @@ Math.sign(1); // Using ES6 object var o = { ->o : { [Symbol.hasInstance]: (value: any) => boolean; a: number; } -> : ^^ ^ ^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^ ->{ a: 2, [Symbol.hasInstance](value: any) { return false; }} : { [Symbol.hasInstance]: (value: any) => boolean; a: number; } -> : ^^ ^ ^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^ +>o : { [x: number]: (value: any) => boolean; a: number; } +> : ^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>{ a: 2, [Symbol.hasInstance](value: any) { return false; }} : { [x: number]: (value: any) => boolean; a: number; } +> : ^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ a: 2, >a : number @@ -129,8 +129,8 @@ o.hasOwnProperty(Symbol.hasInstance); > : ^^^^^^^ >o.hasOwnProperty : (v: PropertyKey) => boolean > : ^ ^^ ^^^^^ ->o : { [Symbol.hasInstance]: (value: any) => boolean; a: number; } -> : ^^ ^ ^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^ +>o : { [x: number]: (value: any) => boolean; a: number; } +> : ^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ >hasOwnProperty : (v: PropertyKey) => boolean > : ^ ^^ ^^^^^ >Symbol.hasInstance : any @@ -223,10 +223,10 @@ var s = Symbol(); // Using ES6 wellknown-symbol const o1 = { ->o1 : { [Symbol.hasInstance]: (value: any) => boolean; } -> : ^^ ^ ^^ ^^^^^^^^^^^^ ^^ ->{ [Symbol.hasInstance](value: any) { return false; }} : { [Symbol.hasInstance]: (value: any) => boolean; } -> : ^^ ^ ^^ ^^^^^^^^^^^^ ^^ +>o1 : { [x: number]: (value: any) => boolean; } +> : ^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^ +>{ [Symbol.hasInstance](value: any) { return false; }} : { [x: number]: (value: any) => boolean; } +> : ^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^ [Symbol.hasInstance](value: any) { >[Symbol.hasInstance] : (value: any) => boolean diff --git a/tests/baselines/reference/parserComputedPropertyName1.types b/tests/baselines/reference/parserComputedPropertyName1.types index b5d37adbd36d9..635ebac3041bf 100644 --- a/tests/baselines/reference/parserComputedPropertyName1.types +++ b/tests/baselines/reference/parserComputedPropertyName1.types @@ -2,10 +2,10 @@ === parserComputedPropertyName1.ts === var v = { [e] }; ->v : { [e]: any; } -> : ^^ ^^^ ^^ ->{ [e] } : { [e]: any; } -> : ^^ ^^^ ^^ +>v : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ +>{ [e] } : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ >[e] : any > : ^^^ >e : any diff --git a/tests/baselines/reference/parserComputedPropertyName13.types b/tests/baselines/reference/parserComputedPropertyName13.types index 0909e7d234a3c..0f33bd7c5f4a2 100644 --- a/tests/baselines/reference/parserComputedPropertyName13.types +++ b/tests/baselines/reference/parserComputedPropertyName13.types @@ -2,8 +2,8 @@ === parserComputedPropertyName13.ts === var v: { [e]: number }; ->v : { [e]: number; } -> : ^^ ^^^^^^ ^^ +>v : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ >[e] : number > : ^^^^^^ >e : any diff --git a/tests/baselines/reference/parserComputedPropertyName14.types b/tests/baselines/reference/parserComputedPropertyName14.types index 38403acf73078..10fa63ce6fe05 100644 --- a/tests/baselines/reference/parserComputedPropertyName14.types +++ b/tests/baselines/reference/parserComputedPropertyName14.types @@ -2,8 +2,8 @@ === parserComputedPropertyName14.ts === var v: { [e](): number }; ->v : { [e]: () => number; } -> : ^^ ^^^^^^ ^^ +>v : { [x: number]: () => number; } +> : ^^^^^^^^^^^^^^^^^^^^^ ^^^ >[e] : () => number > : ^^^^^^ >e : any diff --git a/tests/baselines/reference/parserComputedPropertyName17.types b/tests/baselines/reference/parserComputedPropertyName17.types index 73e0d67626fe4..ae68fcd31d413 100644 --- a/tests/baselines/reference/parserComputedPropertyName17.types +++ b/tests/baselines/reference/parserComputedPropertyName17.types @@ -2,10 +2,10 @@ === parserComputedPropertyName17.ts === var v = { set [e](v) { } } ->v : { [e]: any; } -> : ^^ ^^^ ^^ ->{ set [e](v) { } } : { [e]: any; } -> : ^^ ^^^ ^^ +>v : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ +>{ set [e](v) { } } : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ >[e] : any > : ^^^ >e : any diff --git a/tests/baselines/reference/parserComputedPropertyName18.types b/tests/baselines/reference/parserComputedPropertyName18.types index 2f1327faae44b..b4066ce95250b 100644 --- a/tests/baselines/reference/parserComputedPropertyName18.types +++ b/tests/baselines/reference/parserComputedPropertyName18.types @@ -2,8 +2,8 @@ === parserComputedPropertyName18.ts === var v: { [e]?(): number }; ->v : { [e]: () => number; } -> : ^^ ^^^^^^ ^^ +>v : { [x: number]: () => number; } +> : ^^^^^^^^^^^^^^^^^^^^^ ^^^ >[e] : () => number > : ^^^^^^ >e : any diff --git a/tests/baselines/reference/parserComputedPropertyName19.types b/tests/baselines/reference/parserComputedPropertyName19.types index ec8af3f3351ea..ca0d674d53faf 100644 --- a/tests/baselines/reference/parserComputedPropertyName19.types +++ b/tests/baselines/reference/parserComputedPropertyName19.types @@ -2,8 +2,8 @@ === parserComputedPropertyName19.ts === var v: { [e]? }; ->v : { [e]: any; } -> : ^^ ^^^ ^^ +>v : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ >[e] : any > : ^^^ >e : any diff --git a/tests/baselines/reference/parserComputedPropertyName2.types b/tests/baselines/reference/parserComputedPropertyName2.types index be4041d4e40dd..4e6eec8b73904 100644 --- a/tests/baselines/reference/parserComputedPropertyName2.types +++ b/tests/baselines/reference/parserComputedPropertyName2.types @@ -2,10 +2,10 @@ === parserComputedPropertyName2.ts === var v = { [e]: 1 }; ->v : { [e]: number; } -> : ^^ ^^^^^^ ^^ ->{ [e]: 1 } : { [e]: number; } -> : ^^ ^^^^^^ ^^ +>v : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [e]: 1 } : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ >[e] : number > : ^^^^^^ >e : any diff --git a/tests/baselines/reference/parserComputedPropertyName3.types b/tests/baselines/reference/parserComputedPropertyName3.types index 299cb6426a5a7..4cb2c35c988da 100644 --- a/tests/baselines/reference/parserComputedPropertyName3.types +++ b/tests/baselines/reference/parserComputedPropertyName3.types @@ -2,10 +2,10 @@ === parserComputedPropertyName3.ts === var v = { [e]() { } }; ->v : { [e]: () => void; } -> : ^^ ^^^^^^^^^^ ^^ ->{ [e]() { } } : { [e]: () => void; } -> : ^^ ^^^^^^^^^^ ^^ +>v : { [x: number]: () => void; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [e]() { } } : { [x: number]: () => void; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >[e] : () => void > : ^^^^^^^^^^ >e : any diff --git a/tests/baselines/reference/parserComputedPropertyName37.types b/tests/baselines/reference/parserComputedPropertyName37.types index fce92a3675fd1..bf4aae8927701 100644 --- a/tests/baselines/reference/parserComputedPropertyName37.types +++ b/tests/baselines/reference/parserComputedPropertyName37.types @@ -2,10 +2,10 @@ === parserComputedPropertyName37.ts === var v = { ->v : { [public]: number; } -> : ^^ ^^^^^^ ^^ ->{ [public]: 0} : { [public]: number; } -> : ^^ ^^^^^^ ^^ +>v : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [public]: 0} : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ [public]: 0 >[public] : number diff --git a/tests/baselines/reference/parserComputedPropertyName4.types b/tests/baselines/reference/parserComputedPropertyName4.types index ee9fb20d31190..666bbf5e839b2 100644 --- a/tests/baselines/reference/parserComputedPropertyName4.types +++ b/tests/baselines/reference/parserComputedPropertyName4.types @@ -2,10 +2,10 @@ === parserComputedPropertyName4.ts === var v = { get [e]() { } }; ->v : { [e]: void; } -> : ^^ ^^^^ ^^ ->{ get [e]() { } } : { [e]: void; } -> : ^^ ^^^^ ^^ +>v : { [x: number]: void; } +> : ^^^^^^^^^^^^^^^^^^^^^^ +>{ get [e]() { } } : { [x: number]: void; } +> : ^^^^^^^^^^^^^^^^^^^^^^ >[e] : void > : ^^^^ >e : any diff --git a/tests/baselines/reference/parserComputedPropertyName5.types b/tests/baselines/reference/parserComputedPropertyName5.types index 27e58f3a9c951..2172f5c2ee739 100644 --- a/tests/baselines/reference/parserComputedPropertyName5.types +++ b/tests/baselines/reference/parserComputedPropertyName5.types @@ -2,10 +2,10 @@ === parserComputedPropertyName5.ts === var v = { public get [e]() { } }; ->v : { [e]: void; } -> : ^^ ^^^^ ^^ ->{ public get [e]() { } } : { [e]: void; } -> : ^^ ^^^^ ^^ +>v : { [x: number]: void; } +> : ^^^^^^^^^^^^^^^^^^^^^^ +>{ public get [e]() { } } : { [x: number]: void; } +> : ^^^^^^^^^^^^^^^^^^^^^^ >[e] : void > : ^^^^ >e : any diff --git a/tests/baselines/reference/parserES5ComputedPropertyName2.types b/tests/baselines/reference/parserES5ComputedPropertyName2.types index 3a99c4faabb5d..9891cfe829810 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName2.types +++ b/tests/baselines/reference/parserES5ComputedPropertyName2.types @@ -2,10 +2,10 @@ === parserES5ComputedPropertyName2.ts === var v = { [e]: 1 }; ->v : { [e]: number; } -> : ^^ ^^^^^^ ^^ ->{ [e]: 1 } : { [e]: number; } -> : ^^ ^^^^^^ ^^ +>v : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [e]: 1 } : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ >[e] : number > : ^^^^^^ >e : any diff --git a/tests/baselines/reference/parserES5ComputedPropertyName3.types b/tests/baselines/reference/parserES5ComputedPropertyName3.types index 5c3fb9cd52796..d6fa902f29832 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName3.types +++ b/tests/baselines/reference/parserES5ComputedPropertyName3.types @@ -2,10 +2,10 @@ === parserES5ComputedPropertyName3.ts === var v = { [e]() { } }; ->v : { [e]: () => void; } -> : ^^ ^^^^^^^^^^ ^^ ->{ [e]() { } } : { [e]: () => void; } -> : ^^ ^^^^^^^^^^ ^^ +>v : { [x: number]: () => void; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [e]() { } } : { [x: number]: () => void; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >[e] : () => void > : ^^^^^^^^^^ >e : any diff --git a/tests/baselines/reference/parserES5ComputedPropertyName4.types b/tests/baselines/reference/parserES5ComputedPropertyName4.types index 9a27dd3d186db..eadd6fff2a0c9 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName4.types +++ b/tests/baselines/reference/parserES5ComputedPropertyName4.types @@ -2,10 +2,10 @@ === parserES5ComputedPropertyName4.ts === var v = { get [e]() { } }; ->v : { [e]: void; } -> : ^^ ^^^^ ^^ ->{ get [e]() { } } : { [e]: void; } -> : ^^ ^^^^ ^^ +>v : { [x: number]: void; } +> : ^^^^^^^^^^^^^^^^^^^^^^ +>{ get [e]() { } } : { [x: number]: void; } +> : ^^^^^^^^^^^^^^^^^^^^^^ >[e] : void > : ^^^^ >e : any diff --git a/tests/baselines/reference/parserES5ComputedPropertyName8.types b/tests/baselines/reference/parserES5ComputedPropertyName8.types index a02a99a08fbc7..104894c313e2a 100644 --- a/tests/baselines/reference/parserES5ComputedPropertyName8.types +++ b/tests/baselines/reference/parserES5ComputedPropertyName8.types @@ -2,8 +2,8 @@ === parserES5ComputedPropertyName8.ts === var v: { [e]: number }; ->v : { [e]: number; } -> : ^^ ^^^^^^ ^^ +>v : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ >[e] : number > : ^^^^^^ >e : any diff --git a/tests/baselines/reference/parserES5SymbolProperty8.types b/tests/baselines/reference/parserES5SymbolProperty8.types index e3efb40983d96..ce13b98773f82 100644 --- a/tests/baselines/reference/parserES5SymbolProperty8.types +++ b/tests/baselines/reference/parserES5SymbolProperty8.types @@ -2,8 +2,8 @@ === parserES5SymbolProperty8.ts === var x: { ->x : { [Symbol.toPrimitive]: () => string; } -> : ^^ ^^^^^^ ^^ +>x : { [x: number]: () => string; } +> : ^^^^^^^^^^^^^^^^^^^^^ ^^^ [Symbol.toPrimitive](): string >[Symbol.toPrimitive] : () => string diff --git a/tests/baselines/reference/parserES5SymbolProperty9.types b/tests/baselines/reference/parserES5SymbolProperty9.types index 0e6377835405a..1142830c03adb 100644 --- a/tests/baselines/reference/parserES5SymbolProperty9.types +++ b/tests/baselines/reference/parserES5SymbolProperty9.types @@ -2,8 +2,8 @@ === parserES5SymbolProperty9.ts === var x: { ->x : { [Symbol.toPrimitive]: string; } -> : ^^ ^^^^^^ ^^ +>x : { [x: number]: string; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ [Symbol.toPrimitive]: string >[Symbol.toPrimitive] : string diff --git a/tests/baselines/reference/parserSymbolIndexer5.types b/tests/baselines/reference/parserSymbolIndexer5.types index d5e3cc95cc524..e452fbdbe7903 100644 --- a/tests/baselines/reference/parserSymbolIndexer5.types +++ b/tests/baselines/reference/parserSymbolIndexer5.types @@ -2,10 +2,10 @@ === parserSymbolIndexer5.ts === var x = { ->x : { [s]: any; "": any; } -> : ^^ ^^^ ^^^^^^^^^^^ ->{ [s: symbol]: ""} : { [s]: any; "": any; } -> : ^^ ^^^ ^^^^^^^^^^^ +>x : { [x: number]: any; "": any; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [s: symbol]: ""} : { [x: number]: any; "": any; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [s: symbol]: "" >[s : any diff --git a/tests/baselines/reference/propertiesOfGenericConstructorFunctions.types b/tests/baselines/reference/propertiesOfGenericConstructorFunctions.types index 98ce945e777e9..c1c4ed9ed2c8c 100644 --- a/tests/baselines/reference/propertiesOfGenericConstructorFunctions.types +++ b/tests/baselines/reference/propertiesOfGenericConstructorFunctions.types @@ -95,12 +95,12 @@ var n = map._map2['hi'] > : ^^^^^^ >map._map2['hi'] : number > : ^^^^^^ ->map._map2 : { [ik]: V; } -> : ^^ ^ ^^ +>map._map2 : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ >map : Multimap<"a" | "b", number> > : ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ->_map2 : { [ik]: V; } -> : ^^ ^ ^^ +>_map2 : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ >'hi' : "hi" > : ^^^^ @@ -125,12 +125,12 @@ var n = map._map2['hi'] > : ^^^^^^ >map._map2['hi'] : number > : ^^^^^^ ->map._map2 : { [ik]: V; } -> : ^^ ^ ^^ +>map._map2 : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ >map : Multimap<"a" | "b", number> > : ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ->_map2 : { [ik]: V; } -> : ^^ ^ ^^ +>_map2 : { [x: string]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ >'hi' : "hi" > : ^^^^ diff --git a/tests/baselines/reference/propertyAssignment.types b/tests/baselines/reference/propertyAssignment.types index e79adf3ecf8ce..f9f2a8bc55128 100644 --- a/tests/baselines/reference/propertyAssignment.types +++ b/tests/baselines/reference/propertyAssignment.types @@ -12,8 +12,8 @@ var bar1: { x : number; } > : ^^^^^^ var foo2: { [index]; } // should be an error, used to be indexer, now it is a computed property ->foo2 : { [index]: any; } -> : ^^ ^^^ ^^ +>foo2 : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ >[index] : any > : ^^^ >index : any @@ -48,8 +48,8 @@ foo1 = bar1; // should be an error foo2 = bar2; >foo2 = bar2 : { x: number; } > : ^^^^^ ^^^ ->foo2 : { [index]: any; } -> : ^^ ^^^ ^^ +>foo2 : { [x: number]: any; } +> : ^^^^^^^^^^^^^^^^^^^^^ >bar2 : { x: number; } > : ^^^^^ ^^^ diff --git a/tests/baselines/reference/requireOfJsonFileWithComputedPropertyName.types b/tests/baselines/reference/requireOfJsonFileWithComputedPropertyName.types index 16aa077ab80c8..a095464f382b2 100644 --- a/tests/baselines/reference/requireOfJsonFileWithComputedPropertyName.types +++ b/tests/baselines/reference/requireOfJsonFileWithComputedPropertyName.types @@ -2,36 +2,36 @@ === file1.ts === import b1 = require('./b.json'); ->b1 : { [a]: number; } -> : ^^ ^^^^^^ ^^ +>b1 : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ let x = b1; ->x : { [a]: number; } -> : ^^ ^^^^^^ ^^ ->b1 : { [a]: number; } -> : ^^ ^^^^^^ ^^ +>x : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>b1 : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ import b2 = require('./b.json'); ->b2 : { [a]: number; } -> : ^^ ^^^^^^ ^^ +>b2 : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ if (x) { ->x : { [a]: number; } -> : ^^ ^^^^^^ ^^ +>x : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ x = b2; ->x = b2 : { [a]: number; } -> : ^^ ^^^^^^ ^^ ->x : { [a]: number; } -> : ^^ ^^^^^^ ^^ ->b2 : { [a]: number; } -> : ^^ ^^^^^^ ^^ +>x = b2 : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>x : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>b2 : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ } === b.json === { ->{ [a]: 10} : { [a]: number; } -> : ^^ ^^^^^^ ^^ +>{ [a]: 10} : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ [a]: 10 >[a] : number diff --git a/tests/baselines/reference/typeParameterExtendsPrimitive.types b/tests/baselines/reference/typeParameterExtendsPrimitive.types index 919ce39f6c85c..ad240a058bb82 100644 --- a/tests/baselines/reference/typeParameterExtendsPrimitive.types +++ b/tests/baselines/reference/typeParameterExtendsPrimitive.types @@ -11,10 +11,10 @@ function f() { > : ^ var v = { ->v : { [t]: number; } -> : ^^ ^^^^^^ ^^ ->{ [t]: 0 } : { [t]: number; } -> : ^^ ^^^^^^ ^^ +>v : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>{ [t]: 0 } : { [x: number]: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^ [t]: 0 >[t] : number diff --git a/tests/cases/compiler/declarationEmitComputedNamesInaccessible.ts b/tests/cases/compiler/declarationEmitComputedNamesInaccessible.ts new file mode 100644 index 0000000000000..06ec83b4a5056 --- /dev/null +++ b/tests/cases/compiler/declarationEmitComputedNamesInaccessible.ts @@ -0,0 +1,20 @@ +// @declaration: true +export function f1() { + const localClassFieldName = Math.random() > 0.5 ? "g1" : "g2"; + const localOtherField = localClassFieldName === "g1" ? "g2" : "g1"; + const localStaticField = Math.random() > 0.5 ? "s1" : "s2"; + return class ParameterizedHolder { + [localClassFieldName]() { + return "value"; + } + [localOtherField]() { + return 42; + } + static [localStaticField]() { + return { static: true }; + } + static [localStaticField]() { + return { static: "sometimes" }; + } + } +} \ No newline at end of file diff --git a/tests/cases/compiler/declarationEmitSimpleComputedNames1.ts b/tests/cases/compiler/declarationEmitSimpleComputedNames1.ts new file mode 100644 index 0000000000000..19ca35b2da3ab --- /dev/null +++ b/tests/cases/compiler/declarationEmitSimpleComputedNames1.ts @@ -0,0 +1,32 @@ +// @declaration: true + +export const fieldName = Math.random() > 0.5 ? "f1" : "f2"; +export const conatainer = { + [fieldName]() { + return "result"; + } +}; + +const classFieldName = Math.random() > 0.5 ? "g1" : "g2"; +const otherField = classFieldName === "g1" ? "g2" : "g1"; +const staticField = Math.random() > 0.5 ? "s1" : "s2"; +export class Holder { + [classFieldName]() { + return "value"; + } + [otherField]() { + return 42; + } + static [staticField]() { + return { static: true }; + } + static [staticField]() { + return { static: "sometimes" }; + } +} + +/** + * Could be `"prototype"`, so all static string indexers include the instance type + */ +export const staticLookup = Holder["some" + "thing"]; +export const instanceLookup = (new Holder())["some" + "thing"];